分段故障(核心转储)

时间:2017-07-27 08:00:52

标签: c gcc

以下是我程序中的一段代码。在第一次循环中输入Segmentation fault (core dumped)name后,我收到age错误。

#include<stdio.h>
#include <string.h>
struct Cricketer
{
    char name[25];
    int age;
    float avg_run;
};

int main(){
struct Cricketer c[3];
int i,j;

for (i=0 ; i<3;i++){
    printf("Enter name: \n");
    scanf("%s",c[i].name);

    printf("Enter age: \n");
    scanf("%d",c[i].age);

    printf("Enter average run: \n");
    scanf("%f",c[i].avg_run);               
}
return 0;
}

我找不到导致这个程序的原因。

2 个答案:

答案 0 :(得分:2)

您的错误在这里:

scanf("%d",c[i].age);

将其更改为:

scanf("%d",&(c[i].age));

使用%d时,您必须传递int变量的地址。 floats

也是如此
scanf("%f",&(c[i].avg_run));

使用scanf时,第二个参数必须是变量的地址。使用变量name没有问题,因为它已经引用了要在其中存储字符串的缓冲区的地址。

答案 1 :(得分:1)

使用scanf时,第二个参数应该是变量的地址。在您的计划中c[i].agec[i].avg_run是变量本身而不是地址。使用&运算符获取变量的地址。例如,&(c[i].age)或仅&c[i].age

如上所述,您传递给scanf的是一些可能有效或可能不是有效内存地址的数字。因此,调用未定义的行为

c[i].name碰巧没问题,因为引用一个数组(在这种情况下是name),只需要通过名称计算数组的基址。

启用编译器警告是个好主意。更重要的是阅读并理解警告。阅读编译器手册以获取更多信息。