陷入了分段错误错误
我正在用c
编写一个简单的程序,我遇到了这个错误
分段故障(核心转储)
我知道由于内存访问冲突而发生Segmentation fault
错误。 但是我无法弄清楚下面简单的程序在哪里发生了坏的内存访问。
#include int main() { int a = 0; scanf("%d", a); printf("%d\n", a); return(0); }
我在这里在线编译,在代码块中它也给出了同样的错误。
您必须将指针传递给int
而不是int
本身。 将其更改为
if (scanf("%d", &a) == 1) printf("%d\n", a); else printf("Invalid input\n");
在您的代码中, scanf()
假设int
中的值是它必须写入的地址,从而导致未定义的行为 。 另外,未定义行为的另一个原因是在调用scanf()
之前没有初始化,但这无关紧要,因为无论如何都会发生未定义的行为 。 该标准指定传递给scanf()
任何意外类型的参数都将导致未定义的行为 。
在调用scanf()
之前未初始化a
这一事实意味着如果忽略scanf()
的返回值并且它失败,并且您尝试在代码中的printf()
中读取类似内容,则代码将调用未定义的行为 。 这就是检查返回值非常重要的原因。
运算符的&
地址生成一个包含其操作数地址的指针, scanf()
需要一个指向参数1的指针,以便能够将结果存储在其中。
注意,例如,当一个char
数组传递给scanf()
一个带有"%s"
说明符的字符串时,你不应该使用&
运算符,因为数组名称被转换为poitner到它自己的第一个元素,是那种情况下scanf()
需要的。
1 注意, c中没有通过引用传递 ,因此这是你可以改变scanf()
函数内部参数的唯一方法。
更改
scanf("%d", a);
至
scanf("%d", &a);
scanf需要一个指向变量的指针 ,而不是变量的值 。
我建议你在编译时添加-Wall
选项。 在你的情况下,gcc会警告你:
test.c: In function 'main': test.c:25:5: warning: format '%d' expects argument of type 'int *', but argument 2 has type 'int' [-Wformat=] scanf("%d", a); ^