2011-05-29 136 views
2

我想動態地重新分配一個結構數組的內存(實際上是一個數組,每個結構都是2個,但是這裏爲了簡單起見,這裏是1),這個結構正在被讀取/傳輸到一個文件或者被用戶輸入。Realloc一個結構數組

typedef Struct 
{ 
    char surname[21]; 
    char firstname[21]; 
    char username[21]; 
... 
} User; 

...在main():

int size = 0; /* stores no. of structs */ 
User* user_array = (User *) calloc(1, sizeof(User)); 
if(user_array == NULL) 
{ 
    printf("Cannot allocate initial memory for data\n"); 
    exit(1); 
} 
else 
    size++; 

我想,然後在需要時使用函數調用來增加陣列:

int growArray(User user_array*, int size) 
{ 
    User *temp; 
    size++; 
    temp = (User *) realloc(user_array, (size * sizeof(User)); 
    if(temp == NULL) 
    { 
     printf("Cannot allocate more memory.\n"); 
     exit(1); 
    } 
    else 
     user_array = temp; 
    return size; 
} 

不幸的是,realloc的永遠不會奏效。兩個結構體每個實例只有大約200個字節,並且將初始大小設置爲10就可以正常工作,所以我嘗試使用realloc的方式肯定有問題。

系統是Win 7 64,在運行Quincy(MinGW GUI)的4GB Core i5上。

+1

'INT growArray(用戶user_array,INT大小)'?你錯過了一個'*'嗎? – kennytm 2011-05-29 19:41:25

+0

發佈實際代碼 - 這不會編譯 – 2011-05-29 19:41:59

+0

@KennyTM我認爲他錯過了其中兩個。 – cnicutar 2011-05-29 19:47:23

回答

3

您正在本地更改user_array的值。該函數返回時,該值將丟失。改爲傳遞一個指向user_array指針的指針。

+1

和一個指針的大小太... – Neil 2011-05-29 19:57:18

+0

對不起,我忘了添加*到我的代碼上面...它現在已經修復。 – thelionroars1337 2011-05-29 20:44:55

+0

謝謝 - 這是問題所在。我不明白,直到其他海報更具體地說明如何做到這一點。 – thelionroars1337 2011-05-30 09:36:38

6

realloc將由user_array指向的內存大小更改爲指定大小,但不會按大小增加大小。鑑於你的函數被調用growArray,我會想你想讓它通過size增加數組的大小,在這種情況下,你需要:

int growArray(User **user_array, int currentSize, int numNewElems) 
{ 
    const int totalSize = currentSize + numNewElems; 
    User *temp = (User*)realloc(*user_array, (totalSize * sizeof(User))); 

    if (temp == NULL) 
    { 
     printf("Cannot allocate more memory.\n"); 
     return 0; 
    } 
    else 
    { 
     *user_array = temp; 
    } 

    return totalSize; 
} 

注意growArray需要的user_array地址,原因因爲這是realloc可能會移動內存,如果它不能擴展現有的塊到所需的大小。

要使用它:

int size = 0; 
User* user_array = (User *) calloc(1, sizeof(User)); 
if(user_array == NULL) 
{ 
    printf("Cannot allocate initial memory for data\n"); 
    exit(1); 
} 

/* add 10 new elements to the array */ 
size = growArray(&user_array, size, 10); 
+0

當它傳遞給growArray時,Size等於數組中結構的數量(在它增加之前)。 growArray中的++的大小會將其增加到新的數字上(打算一次增加1個 - 從文件中的未知條目數量或用戶添加),所以我相信size * sizeof(User)對此是正確的做法。我注意到你已經使用了雙重間接運算符@cnicutar了,我仍然試圖讓我的頭在那裏發生的事情。這一定是我出錯的地方......如果我不這樣做,我仍然會使用user_array的舊開始地址? – thelionroars1337 2011-05-29 22:54:04

+1

是的,那可能是你的問題。'realloc'可能無法將現有的'user_array'指針內存塊擴展到足夠大的尺寸。如果發生這種情況,它會在其他地方分配一個**新**內存塊,並從'user_array'上覆制所有內容。返回值是新的內存位置。使用pointer-to-a-pointer允許'growArray'更新調用者的user_array的值,因爲其先前的值現在是無效的。 – Node 2011-05-29 23:03:39