2017-05-07 66 views
1

我在代碼中有問題。 malloc工作和在while循環,realloc()第一次工作,當它被稱爲第二次它總是失敗。 該代碼是獲取數字的主要因素的算法的一部分。爲什麼realloc每次都失敗?

int main() 
{ 
    int n, in, *ar, len = 0; 
    scanf("%d", &n); 
    ar = (int *) malloc(1 * sizeof(int)); 
    while(n % 2 == 0){ 
     ar[len] = 2; 
     len++; 
     ar = (int *) realloc(ar, len * sizeof(int)); 
     if(ar == NULL){ 
      printf("Error"); 
      return 1; 
     } 
     n /= 2; 
    } 
    return 0; 
} 

我試着用len初始化爲1,但仍然失敗。奇怪的是它在第一次通話中不會失敗,但在第二次通話時失敗。我已經閱讀過其他類似的問題,但我是初學者,我不瞭解。 在此先感謝!

+0

沒有包括''和演員來的'realloc'使所有的差異造成的。 – pmg

+0

@pmg我已經包括,我不明白realloc有什麼問題 –

+0

沒有''包括在內,編譯器假定'realloc'返回一個int,然後在cast中將int轉換爲一個指針。首先:'malloc'返回一個指針並將該指針解釋爲一個int值可能會改變該值。其次:將(無效)int轉換爲指針是無效的轉換;該轉換使得編譯器在沒有警告的情況下接受它。 – pmg

回答

6

在您的程序中,您正在訪問數組越界。這導致未定義的行爲。

最初,當len = 0,在while循環:

ar[len] = 2; //ar[0] = 2; 
len++;  //len = 1 
ar = (int *) realloc(ar, len * sizeof(int)); 
//ar is of size 1 

然後在下一迭代中,當len = 1

ar[1] = 2; //you cannot access ar[1] as size of `ar` is only 1. 

此繼續隨着每次迭代。爲了避免這種情況嗎:

//initialize len to 1 
int len = 1; 

,並在while循環使用ar[len-1],而不是ar[len]

看一看這樣的:How dangerous is it to access an array out of bounds?

+1

感謝您糾正我的英語! –