EXC_BAD_ACCESS присваивание переменной сразу после вызова функции - PullRequest
0 голосов
/ 10 января 2019

Я пишу очень простую программу на C для базового курса, и я получаю EXC_BAD_ACCESS в строке 14. Я не понимаю, в чем проблема. Программа запрашивает у пользователя число, а затем отображает связанный с ним символ ASCII.

Это происходит, AFAIK, только при отладке моей программы с помощью lldb. Он отлично работает при запуске из командной строки или на onlinegdb.com . Кроме того, если я закомментирую строку 13 и назначу true или false на loop_ctrl вместо возвращаемого значения UserWantsToExit, все будет работать как ожидалось.


    #include <stdio.h>
    #include <stdbool.h>

    void GetAndDisplayInput(void);
    bool UserWantsToExit(void);

    int main()
    {
        bool loop_ctrl = true;

        while (loop_ctrl)
        {
            GetAndDisplayInput();
            loop_ctrl = !UserWantsToExit(); /* EXC_BAD_ACCESS */
        }

        return 0;
    }

    void GetAndDisplayInput()
    {
        char input_char = '0';

        printf("\nInput a number: ");
        scanf("%i", &input_char);
        getc(stdin); /* Gets rid of '\n' */

        printf("\n\nIt's character '%c'!\n\n", input_char);
    }

    bool UserWantsToExit()
    {
        char choice = '0';
        bool value = false;

        printf("\nDo you want to exit? (Y/N): ");
        scanf("%c", &choice);
        getc(stdin); /* Gets rid of '\n' */
        value = (choice == 'y' || choice == 'Y');

        return value;
    }

1 Ответ

0 голосов
/ 10 января 2019

Дескриптор формата %i, используемый при вызове scanf() в функции GetAdnDisplayInput(), требует соответствующего аргумента типа указатель на int. Вы передаете указатель на char. Неопределенное поведение не определено.

Обратите внимание, что ваш компилятор C должен был предупредить вас о несоответствии между дескриптором формата и соответствующим аргументом; Вы должны привыкнуть к компиляции со всеми возможными предупреждениями.

...