陷入了分段错误错误

我正在用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); ^