2017-07-27 116 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並且結果將會相同。 –