遇到分段错误错误

Got stuck with Segmentation Fault Error

我正在 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() 之前未初始化,但这无关紧要,因为无论如何 未定义行为 都会发生。该标准指定传递给 scanf() 的任何意外类型的参数都将导致 未定义的行为

事实上 a 在调用 scanf() 之前没有被初始化意味着如果你忽略了 scanf() 的 return 值并且它失败了,并且你尝试读取a 就像您代码中的 printf() 一样,您的代码将调用 未定义的行为 。这就是检查 return 值如此重要的原因。

& address of 运算符生成一个包含其操作数地址的指针,scanf() 需要一个指向参数的指针 1 以便能够将结果存储在其中。

请注意,当将数组(例如 char 数组传递给 scanf() 带有 "%s" 说明符的字符串时,不应使用 & 运算符,因为数组名称被转换为指向其自身第一个元素的指针,这正是 scanf() 在这种情况下所需要的。


1注意,中没有引用传递,所以这是您可以在 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);
     ^