陷入了分段错误错误

时间:2016-01-21 15:31:52

标签: c segmentation-fault runtime-error

我在c写了一个简单的程序,我遇到了这个错误

  

分段错误(核心转储)

我知道由于内存访问冲突而发生Segmentation fault错误。 但是我无法弄清楚下面简单的程序在哪里发生了坏的内存访问。

#include<stdio.h>
int main()
{
    int a = 0;   
    scanf("%d", a);
    printf("%d\n", a);
    return(0);
}

我在线编译here,在代码块中也会出现同样的错误。

2 个答案:

答案 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 注意,中没有通过引用传递,所以这是你可以改变内部参数的唯一方法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);
     ^