我在c
写了一个简单的程序,我遇到了这个错误
分段错误(核心转储)
我知道由于内存访问冲突而发生Segmentation fault
错误。
但是我无法弄清楚下面简单的程序在哪里发生了坏的内存访问。
#include<stdio.h>
int main()
{
int a = 0;
scanf("%d", a);
printf("%d\n", a);
return(0);
}
我在线编译here,在代码块中也会出现同样的错误。
答案 0 :(得分:5)
您必须将指针传递给int
而不是int
本身。将其更改为
if (scanf("%d", &a) == 1)
printf("%d\n", a);
else
printf("Invalid input\n");
在您的代码中,scanf()
假设int
中的值是它必须写入的地址,从而导致未定义的行为。另外,未定义行为的另一个原因是a
在调用scanf()
之前已经初始化了,但这无关紧要,因为无论如何未定义的行为将会发生。该标准指定传递给scanf()
的任何意外类型参数都将导致未定义的行为。
a
在调用scanf()
之前未初始化的事实意味着如果忽略scanf()
的返回值并且它失败了,那么您尝试阅读a
之类的内容在代码中的printf()
中,您的代码将调用未定义的行为。这就是为什么检查返回值非常重要的原因。
运算符的&
地址生成一个包含其操作数地址的指针,scanf()
需要指向参数 1的指针以便能够将结果存储在其中。
请注意,在将数组(例如char
数组)传递给scanf()
一个带"%s"
说明符的字符串时,不应使用&
运算符,因为数组name被转换为自身的第一个元素的poitner,这就是scanf()
在这种情况下所需要的。
1 注意,c中没有通过引用传递,所以这是你可以改变内部参数的唯一方法scanf()
功能。
答案 1 :(得分:5)
更改
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);
^