2013-11-24 29 views
1

我有這樣的代碼:有人可以找到錯誤嗎?純C的realloc

int main() { 
    int i=0, n=0; 
    char sep=NULL; 
    double **aero=(double**)malloc(sizeof(double*)); 
    *aero=(double*)malloc(2*sizeof(double)); 
    printf("Zadejte souradnice:\n"); 
    while (1) { 
     aero=(double**)realloc(aero,(n+1)*sizeof(double*)); 
     for (i=0; i<n+1; i++) { 
      aero[i]=(double*)realloc(aero[i],2*sizeof(double)); 
     } 
     if ((scanf("[%lf,%lf]%c",&aero[n][0],&aero[n][1],&sep))==3 && (sep=='\n' || sep==' '))  { 
      n++;  
      continue; 
     } else if (!feof(stdin)) { 
      printf("Nespravny vstup.\n"); 
      freeArray2D(aero,n); 
      return 0; 
     } 
     break; 
    } 
} 

它工作正常,但我可以scanf函數座標(格式爲:[X,Y])只有19倍。然後它顯示我分段錯誤(核心轉儲)。我用Linux編譯器gcc -Wall -pedantic main.c -lm我不知道,問題在哪裏。謝謝你的幫助。

+0

向我們展示一些示例輸入和'freeArray2D'函數。 –

+0

選擇這可能有所幫助:http://stackoverflow.com/questions/7656799/segfault-with-realloc?rq = 1 –

+0

OT:'char sep = NULL;'應該是'char sep ='\ 0';'或者'... = 0;'。 – alk

回答

1

aero[i]=(double*)realloc(aero[i],2*sizeof(double)),如果i == n,則aero[i]是未初始化的。您不應該在未初始化的指針上調用realloc

1

你永遠不會分配一個新的malloc ED緩衝區aero[1],但通過垃圾在那裏realloc。也許你期望reallocaero零初始化內存?

1

你的具體問題是,你的realloc一個指針,aero[n],這是從來沒有malloc ed在第一個地方(並不一定是NULL)。這是一場災難。

你也有另外一個問題,雖然它比致命的缺陷更不是一個不必要的工作問題。當他們沒有真正改變內容的大小時,您正在循環中重新分配每個aero[]變量。在我看來,所有你需要在循環做的僅僅是增加內存aero第一級的大小和它的新元素分配內存:

while (1) { 
    aero = realloc (aero, (n+1) * sizeof (double*)); 
    aero[n] = malloc (2 * sizeof (double)); 
    : 

你會發現我已經刪除了鑄造的malloc返回值。 C中的這種轉換是不明智的,因爲它可以隱藏某些細微的錯誤。 C完全能夠將void*返回值隱式轉換爲任何其他指針類型

,當然,你應該永遠假設你的內存分配將工作 - 我願意爲NULL來檢查返回值,如果我發現一個立即退出。

我唯一的其他問題(除了我當時無法閱讀捷克語)是char sepNULL的設置。 NULL通常保留爲指針而不是字符,因此如果將其初始化爲\0,它看起來更明智。

相關問題