陷入了分段错误错误

Ati*_*esh 0 c runtime-error segmentation-fault

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

分段故障(核心转储)

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

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

我在这里在线编译,在代码块中它也给出了同样的错误.

Iha*_*imi 5

您必须传递指针int而不是int自身.将其更改为

if (scanf("%d", &a) == 1)
    printf("%d\n", a);
else
    printf("Invalid input\n");
Run Code Online (Sandbox Code Playgroud)

在您的代码中,scanf()假设其中的值int是它必须写入的地址,从而导致未定义的行为.另外,未定义行为的另一个原因是a在调用之前没有初始化,scanf()但这无关紧要,因为无论如何都会发生未定义的行为.该标准指定传递给任何意外类型的参数scanf()将导致未定义的行为.

a在调用之前未初始化的事实scanf()暗示如果忽略返回值scanf()并且它失败,并且您尝试a像在printf()代码中那样读取,则代码将调用未定义的行为.这就是检查返回值非常重要的原因.

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

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


1 注意,没有通过引用传递,所以这是你可以改变内部参数的唯一途径scanf()功能.

  • @Atinesh不,这是当您没有仔细阅读您使用的功能的文档时会发生的情况.如果您阅读[`scanf()`](http://man7.org/linux/man-pages/man3/scanf.3.html),您也会理解为什么我将它的返回值与"1"进行比较.总是如此,忽略返回值可能会导致非常奇怪的错误. (2认同)

LPs*_*LPs 5

更改

scanf("%d", a);
Run Code Online (Sandbox Code Playgroud)

scanf("%d", &a);
Run Code Online (Sandbox Code Playgroud)

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);
     ^
Run Code Online (Sandbox Code Playgroud)