2017-07-19 43 views
2

所以我面臨一個奇怪的問題。聲明後續未使用的int時,出現分段錯誤。當我刪除聲明時,代碼完美運行。怎麼會這樣?涉及未使用變量的分段錯誤

FILE* ptr = fopen("prueba.txt", "r"); 
int x; 
char* a; 
int y = 0; //this cause the seg fault. 
do{ 
    while (fscanf(ptr, "%i", &x)!=-1){ 
     fscanf(ptr, "%s", a); 
      printf("%i %s ",x, a); 
    } 
    fseek(ptr, 0, SEEK_SET); 
}while(1); 


fclose(ptr); 
} 

但是即使我使用它,說有y++;printf後,我仍然得到分割故障。

+0

fscanf(ptr,「%s」,a);這看起來像是問題。 a不是malloced – CIsForCookies

+2

'fscanf(ptr,「%s」,a);'覆蓋隨機存儲器。通過添加一個變量,你碰巧改變了它所踩踏的隨機存儲器。 – Art

+0

@藝術,太短的答案得到autochanged評論。如果您可以在答案部分中找到答案,它將有助於永久性地在「未答覆」部分中顯示此問題。 – CDahn

回答

5

printf後我仍然seg。故障。

那麼,段錯誤可能是由原因A引起的,只有在一段時間後纔會被捕獲。

此行:fscanf(ptr, "%s", a)正在讀取字符串到a而不先分配內存 - > UB。

僅在printf處調用UB。修復aa=malloc(SOME_SIZE)char a[SOME_SIZE],這應該消失

1

需要初始化你的字符指針,char *a,通過使用callocmalloc功能。或者,使用自動存儲持續時間的陣列,如char a[20];

在代碼中,你逝去的未初始化的指針到fscanf()有效也就是說fscanf()是要覆蓋到的內存的未定義區域。

+1

*使用堆棧分配*如果您將措辭更改爲「使用具有自動存儲持續時間的陣列」會更好。 –