2012-11-09 36 views
1

我遇到了我的代碼問題,希望你能幫上忙。當我輸入一個奇數時,我給出了一個分段錯誤,並且如果它是偶數則發生總線錯誤。我試圖將00添加到數據數組中,以將它從長度Nprime轉換爲我輸入的新的更大長度的Ndprime。我在函數* fpad中執行此操作,其中我的paddata數組包含Nprime複數(即2 * Nprime組件),並且需要將其調整爲2 * Ndprime大小。總線錯誤和分段錯誤取決於輸入的值

double *fpad(double *paddata, unsigned int Nprime, unsigned int Ndprime) 
{ 
    if (Nprime!=Ndprime) 
    { 
     paddata=(double*)realloc(paddata,(sizeof(double)*((2*Ndprime)-1))); 

     for(i>=((2*Nprime));i<(2*Ndprime);i++) paddata[i]=0; 

     if(paddata==NULL)    /* Checks memory is reallocated */ 
     { 
      printf("\nError reallocating memory.\n"); 
      free(paddata); 
      exit(EXIT_FAILURE); 
     } 
    } 
    return(paddata); 
} 

任何幫助將不勝感激,我不明白我做錯了什麼。

+0

當你知道它是'NULL'時,'free(paddata)'沒有意義。 – Jens

回答

1

您正在使用未聲明的變量i(或者它可能是全局的)。

for(i>=((2*Nprime));i<(2*Ndprime);i++) paddata[i]=0; 

你的第一條件檢查i是否小於或大於2*Nprime更大(但不設置i)。然後它會使用這個未正確初始化的值i訪問該陣列,這可能是負面的,這會導致問題。

您只檢查在上面診斷爲循環問題的循環之後內存重新分配是否成功。如果內存分配失敗,那麼您已經仔細地將該函數中指針的原始副本刪除。釋放空指針沒有意義 - 但是由於您在分配失敗時退出,所以沒有太多問題。

把你的初始化循環內存檢查後,略少繁榮括號中的數字:

for (int i = 2*Nprime; i < 2*Ndprime; i++) // C99 (and C++) 
    paddata[i] = 0.0; 

如果你不能使用C99符號,在函數聲明int i;

不要創建名爲i的全局變量。

請注意編譯器的警告。如果它沒有警告你'沒有效果的陳述',那麼你沒有發出足夠的警告。

+0

我已經得到它的工作,embarrissingly我會在以前的函數mableced我的paddata數組太小。但是,謝謝你,我已經定義了我的i,但是是需要的行嗎?我認爲realloced數組有未初始化的元素,它們是否已經填滿0? –

+0

發生這些事情。請注意'我'。這個問題可能會被封閉,「太局部」。沒有打算犯罪,但這個問題在未來不會幫助其他人。 –

+0

陣列中的額外數據未初始化;你想要初始化它是正確的。但是,只有當您知道有數據要初始化時,才應該初始化 - 在檢查分配之後。當然,你需要確保你正在使用一個正確初始化的循環變量。 –

0

我推薦功能memset函數來初始化你的動態數組。我認爲'for'語句中的索引'i'應該在0到2 * Ndprime-2範圍內。