我正在用 c
编写一个简单的程序,但遇到了这个错误
Segmentation Fault (Core dumped)
我知道 Segmentation fault
错误是由于内存访问冲突而发生的。
但是我无法弄清楚下面简单程序中发生错误内存访问的位置。
#include<stdio.h>
int main()
{
int a = 0;
scanf("%d", a);
printf("%d\n", a);
return(0);
}
我在线编译here , 在代码块中它也给出了同样的错误。
最佳答案
您必须将指针传递给 int
而不是 int
本身。改成
if (scanf("%d", &a) == 1)
printf("%d\n", a);
else
printf("Invalid input\n");
在您的代码中,scanf()
假设 int
中的值是它必须写入的地址,从而导致未定义的行为。此外,未定义行为的另一个原因是 a
在调用 scanf()
之前未初始化,但这无关紧要,因为无论如何 undefined behavior 正在发生发生。该标准指定传递给 scanf()
的任何意外类型的参数都将导致未定义的行为。
事实上 a
在调用 scanf()
之前没有被初始化意味着如果你忽略 scanf()
的返回值并且它失败,并且您尝试像在代码中的 printf()
中那样读取 a
,您的代码将调用未定义的行为。这就是检查返回值如此重要的原因。
&
address of 运算符生成一个包含其操作数地址的指针,scanf()
需要一个指向参数的指针1 以便能够将结果存储在其中。
请注意,当传递一个数组时,例如,一个 char
数组到 scanf()
一个带有 "%s"
说明符的字符串,您不应该使用 &
运算符,因为数组名称被转换为指向其自身第一个元素的指针,这正是 scanf()
在这种情况下所需要的。
1请注意,c 中没有引用传递 ,所以这是您可以在 scanf()
函数内更改参数的唯一方法。
关于c - 遇到段错误错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34927803/