EXC_BAD_ACCESS在函数调用后立即分配给变量

时间:2019-01-10 14:44:53

标签: c macos exc-bad-access lldb

我正在为基础课程编写一个非常简单的C程序,并且在第14行上获得了EXC_BAD_ACCESS。我看不出问题出在哪里。 该程序要求用户输入数字,然后显示与之关联的ASCII字符。

仅当使用lldb调试程序时,这种情况才会发生,AFAIK。从命令行或在onlinegdb.com上运行时,它工作得很好。 另外,如果我注释掉第13行,并将truefalse分配给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 :(得分:3)

在函数%i中对scanf()的调用中使用的格式描述符GetAdnDisplayInput()需要一个指向int的类型指针的对应参数。您正在传递指向char的指针。未定义的行为是未定义的。

请注意,您的C编译器应该警告您有关格式描述符和相应参数之间的不匹配;您应该养成在打开所有可能的警告的情况下进行编译的习惯。