Я получаю эту ошибку 0xC0000005: Место записи нарушения прав доступа 0x0086B000 - PullRequest
3 голосов
/ 31 мая 2019

Я устал от того же кода на https://repl.it/languages/c, и я не получаю ошибок, но когда я вставляю тот же код на Visual Studio 2017 , я получаю эту ошибку относительно:

#include <stdio.h>
#include <string.h>
char input[100];
int calc();
int main() {
    printf("Type \"help\" or enter a mathematical expression\n");
    calc();
}
int calc() {
    printf("Calc:\\> ");
    scanf_s("%s", input);
    if (strcmp(input, "help") == 0) {
        printf("Help is on the way\n");
    }
    else {
        printf("Answer:\\> %s\n", input);
    }
    calc();
    return 0;
}

Но я получаю эту ошибку при запуске:

Exception thrown at 0x50FFD4EC (ucrtbased.dll) in Project.exe: 0xC0000005: Access violation writing location 0x0086B000.

1 Ответ

4 голосов
/ 01 июня 2019

Задача 1:

Вы звоните calc() рекурсивно без базового случая. Это означает, что при вызове этой функции вы неизбежно вызовете переполнение стека.

Решение: Удалить рекурсивный вызов на calc() in calc().

Задача 2:

scanf_s требует, чтобы строковый аргумент, удовлетворяющий спецификатору формата %s, шел непосредственно перед целочисленной переменной, задающей длину буфера. См. Документацию по MSDN .

Решение: передайте также длину строки:

scanf_s("%s", input, 100);

Примечание: проверка возвращаемого значения scanf -семейных функций обычно является хорошей идеей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...