2013-11-01 91 views
0

以下代碼塊給出分段錯誤。請幫助。爲什麼分段錯誤

#include<stdio.h> 
    int main(){ 
     int testcase,num; 
     int i,j,*array; 
     scanf("%d",&testcase); 
     for(i=0;i<testcase;i++){ 
      scanf("%d",&num); 
      for(j=0;j<num;j++){ 
       scanf("%d",(array+j)); 
      } 
     } 
     i=0; 
     for(i=0;*(array+i)!='\0';i++){ 
      printf("%d",1); 
     } 
     } 
+1

由於'的scanf( 「%d」,(數組+ J));'調用**未定義行爲**。 'array'是一個不確定的指針。最後的for循環同樣無效。 – WhozCraig

+0

它在哪裏segfault,爲什麼你沒有在調試器中通過? – mjs

+0

但是這個細分並沒有給出分割錯誤 –

回答

5

編輯2

希望把這個放在上面。

我只注意到你的代碼有點奇怪。當你讀取數字時,你會看到i以上的循環,但是在j裏面有另一個循環 - 每次迭代你只是覆蓋你已經讀過的值。這很奇怪,我不確定你最初的意圖是什麼。因此,儘管segmentation fault仍造成的,因爲未分配的數組,我寫到這裏的解決方案是不正確的(我不知道什麼是正確的解決方案,直到我明白你的意思做)

Edit2末尾

array未初始化。

這是一個指向內存中某個地方的指針,但那個地方並不是免費的,所以當你寫這些時,你會寫出重要的東西並導致分段錯誤。

解決它在你的情況下,最好的方法是添加

array=malloc(sizeof(int)*testcase); 

只是在那裏你讀testcase行之後,所以剛過

scanf("%d",&testcase); 

另外,如果你這樣做,這是一旦你完成了使用記憶的好習慣free。所以你的情況增加

free(array); 

大功告成打印整個陣列

編輯剛過只注意到你有另一個錯誤 - 在這裏你打印數組循環:

for(i=0;*(array+i)!='\0';i++){ 

這是不好的,因爲你正在對待array,這是一個整數的數組,就像它是一個字符串。 「正常」陣列不會以'\0'結束。此外 - '\0'char,而*(array+i)int

替換符合

for (i=0;i<testcase;i++){ 
+0

不,我不想閱讀測試用例 –

+0

不要忘記釋放你動態分配的內存。 – MarekR

+0

@Johnsmith你讀過'testcase'。使用'scanf'。 – rabensky