2017-07-27 106 views
-1

下面是我的程序中的一段代码。在第一个循环中输入nameage后,我收到了错误Segmentation fault (core dumped)分段错误(核心转储)

#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; 
} 

而我找不到是什么导致此程序。

+5

不,它不是崩溃的'gcc'(*编译器*)。当你运行它时,它就是你的程序。至于如何解决它,你首先使用调试器来定位它发生的程序的位置。请阅读Eric Lippert撰写的[如何调试小程序](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。 –

+1

那么你的问题“你如何调试核心转储?”如果是这样,你应该说明你的平台和/或你喜欢的调试器。 –

+1

编译所有警告和调试信息:'gcc -Wall -Wextra -g'。然后**使用调试器'gdb' **。你修复我的代码问题是脱离主题。 –

回答

3

你的错误是在这里:

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

更改它:

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

当使用%d你必须通过int变量的地址。与同为floats

scanf("%f",&(c[i].avg_run)); 

当使用scanf的,第二个参数必须是一个变量的地址。使用变量name不存在任何问题,因为它已经引用了要存储字符串的缓冲区的地址。

+3

对于'c [i] .avg_run'也是如此# – vasek

+0

对'name'也一样吗? –

+0

不,对于'name'是正确的 – Jesferman

2

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

如上所述,你传递给scanf的是一些数字,它们可能是也可能不是有效的存储器地址。因此调用未定义的行为

​​碰巧没有问题,因为通过引用数组(name在这种情况下)只通过名称求值到数组的基地址。

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

+1

为什么'&(c [i] .age)'中多余的括号而不是简单的'&c [i] .age'? –

+0

@JonathanLeffler :)我永远不会记住优先规则。 – babon

+0

额外括号是可选的,您也可以使用&c [i] .age并且结果将会相同。 –