EXC_BAD_ACCESS 在函数调用后立即赋值给变量
EXC_BAD_ACCESS assigning to variable right after function call
我正在为基础课程编写一个非常简单的 C 程序,并且在第 14 行上一直得到 EXC_BAD_ACCESS
。我看不出问题是什么。
该程序要求用户输入一个数字,然后显示与之关联的 ASCII 字符。
据我所知,这只会在使用 lldb
调试我的程序时发生。当从命令行 运行 或 onlinegdb.com 时,它工作得很好。
此外,如果我注释掉第 13 行,并将 true
或 false
分配给 loop_ctrl
,而不是 UserWantsToExit
的 return 值,一切都会按预期进行。
#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;
}
在函数 GetAdnDisplayInput()
中调用 scanf()
时使用的格式描述符 %i
需要指向 int
的指针类型的相应参数。您正在传递指向 char
的指针。未定义的行为是未定义的。
请注意,您的 C 编译器应该已就格式描述符与相应参数之间的不匹配发出警告;你应该养成在打开所有可能警告的情况下编译的习惯。
我正在为基础课程编写一个非常简单的 C 程序,并且在第 14 行上一直得到 EXC_BAD_ACCESS
。我看不出问题是什么。
该程序要求用户输入一个数字,然后显示与之关联的 ASCII 字符。
据我所知,这只会在使用 lldb
调试我的程序时发生。当从命令行 运行 或 onlinegdb.com 时,它工作得很好。
此外,如果我注释掉第 13 行,并将 true
或 false
分配给 loop_ctrl
,而不是 UserWantsToExit
的 return 值,一切都会按预期进行。
#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;
}
在函数 GetAdnDisplayInput()
中调用 scanf()
时使用的格式描述符 %i
需要指向 int
的指针类型的相应参数。您正在传递指向 char
的指针。未定义的行为是未定义的。
请注意,您的 C 编译器应该已就格式描述符与相应参数之间的不匹配发出警告;你应该养成在打开所有可能警告的情况下编译的习惯。