以下是我程序中的一段代码。在第一次循环中输入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;
}
我找不到导致这个程序的原因。
答案 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].age
和c[i].avg_run
是变量本身而不是地址。使用&
运算符获取变量的地址。例如,&(c[i].age)
或仅&c[i].age
。
如上所述,您传递给scanf
的是一些可能有效或可能不是有效内存地址的数字。因此,调用未定义的行为。
c[i].name
碰巧没问题,因为引用一个数组(在这种情况下是name
),只需要通过名称计算数组的基址。
启用编译器警告是个好主意。更重要的是阅读并理解警告。阅读编译器手册以获取更多信息。