2013-07-29 70 views
1

我有一些問題使用realloc(),所以我做了一個示例程序,用盡可能少的代碼來說明問題。使用realloc()獲取程序

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

int main(void) 
{ 
    unsigned int i; 
    unsigned long long *a; 
    srand(time(NULL)); 
    a = malloc(sizeof(unsigned long long)); 
    for (i = 0; i < 20; ++i) 
    { 
     a[i] = rand() % 32; 
     printf("%llu\n", a[i]); 
     a = realloc(a, (i + 1) * sizeof(unsigned long long)); 
    } 
    return 0; 
} 

此輸出:

* glibc的檢測演示:realloc的():無效的下一個大小:0x0000000000dc3010 * *

爲什麼這會崩潰?

編輯: 我試圖chaning (i + 1)(i + 2)然後程序的工作,但我不明白爲什麼。我只請求擴展內存空間一個unsigned long long

+0

你沒有收到任何編譯錯誤? –

+0

不是。這是一個運行時間消息。 – Jori

+0

它必須訪問受保護的外部數組。 – BLUEPIXY

回答

12

第一次循環運行時,i等於0。你realloc a舉行i + 1元素,這是... 1! 第二次循環運行時,您嘗試使用i == 1寫入a[i],這是第二個元素的數組。但是由於你的陣列只能容納1元素,可能會導致崩潰。

+0

啊,當然。 – Jori

+0

非常好Nbr!它由於緩衝區溢出,但由於'relloc()'函數正確? –

+0

是的,但僅僅是因爲重新分配本身太小。正如另一位回答者提到的,它應該是'i + 2'來保存比當前金額多一個元素。 – Nbr44

0

您分配位置i但訪問位置i+1

不要忘記釋放分配的內存退出

free(a); 

之前,所以做此修改,以使此代碼工作

a = realloc(a, (i + 2) * sizeof(unsigned long long)); // ERROR HERE

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

    int main(void) 
    { 
     unsigned int i; 
     unsigned long long *a; 
     srand(time(NULL)); 
     a = malloc(sizeof(unsigned long long)); 
     for (i = 0; i < 20; ++i) 
     { 
      a[i] = rand() % 32; 
      printf("%llu\n", a[i]); 
      a = realloc(a, (i + 1) * sizeof(unsigned long long)); // ERROR HERE 
     } 
     return 0; 
    } 
+0

哦,是的忘了提及:我嘗試過,然後它的工作,但我不明白爲什麼。將在一秒內更新信息。 – Jori