2015-05-29 68 views
0

我試圖擴展我的玩家列表。使用realloc調整動態數組的大小

當我使用reallo c函數時,它會保存除最後一個以外的播放器。 我的意思是說,如果我的陣列中有4名球員,並且我試圖將我的陣列擴展到7個,我得到了一個7號陣列和3名球員的新陣列。

這是函數的一部分:自己從initializeListForTree()功能

void initializeListForTree(Player** players, int listSize) 
{ 
    int formulaSize = bla bla bla..... 
    players = (Player **)realloc(players, sizeof(Player *)*formulaSize); 
    if (!players) 
    { 
     printf("memory allocation failed\n"); 
    } 
} 

回答

0

更多類似:

void initializeListForTree(Player*** players, int listSize) 
{ 
int formulaSize = bla bla bla..... 
void *p = realloc(*players, sizeof(Player *)*formulaSize); 

    if (!p) { 
     printf("memory allocation failed\n"); 
    } 
    else { 
    *players = p; 
    } 
} 

,並在調用點

Player **playerslist = NULL; 

initializeListForTree(&playerslist, 1); 
... 
initializeListForTree(&playerslist, 2); 
etc.. 

這,當然,只有當你的類型是一個指向指針列表。

1

不,你不能改變players()。 C使用按值傳遞函數參數傳遞。任何對player所做的更改initializeListForTree()函數內部都不會反映爲所使用的實際參數。

如果您必須完成此操作,您需要將指針傳遞給players

如果你不介意,具有替代的方法,如果從initializeListForTree()選擇return新 分配的指針,並收集同進通過實際的參數,那麼你就不會需要傳遞一個指針到 - 指針指向

這就是說,

  • do not castCmalloc()和家人的返回值。
  • 請不要將返回值realloc()直接存儲到目標指針中。如果realloc()失敗,它將覆蓋有效的條目。
+0

所以你的意思是我需要做這樣的事情:player [i] = realloc(player [i],sizeof(Player *))??? – motis10

+0

@ user1703871我已經更新了我的答案,您可以選擇適合您的whochever邏輯。 :-) –

+0

@ user1703871是的,如果你想改變'player [i]',你當然可以從'initializeListForTree()'做。但是,爲什麼你使用'realloc()'?一個簡單的'malloc()'有什麼問題? –

0

realloc()找到擴展內存:

  • 如果在原來的內存後足夠的自由空間,那麼它將使用,而原來的地址並沒有改變。
  • 如果orignal內存在堆結尾/ ..,它會擴展內存,所以原始地址不會改變。
  • 如果原始內存位於堆的中間,並且沒有足夠的空間,那麼它將分配一個新的內存塊,並將原始內存複製到新內存中,以便地址更改。

最後一種情況發生的機會很大,因此您總是需要在撥打realloc()後更新您的地址。

而舊地址可能會被放入可用內存列表中,您不應該再觸碰它。它可能會在未來由另一個malloc()/ ..調用分配。

你可以看到,realloc()可能很重,因爲它可能需要複製內存,所以如果可能的話,改進代碼以避免使用它。


這裏是一個可能的使用情況(從TLPI):

// nptr is new pointer, ptr is your original pointer, 

    nptr = realloc(ptr, newsize); 
    if (nptr == NULL) { 
     /* Handle error */ 
    } else { 
     /* realloc() succeeded */ 
     ptr = nptr; 
    } 

基本上,第一次檢查返回值,看看它是否成功:

  • 如果失敗了,那麼原來的內存留不變。
  • 如果成功,則將新地址分配給原始指針。

而且,您需要確保您沒有指向原始內存中間的另一個指針,因爲這也會發生變化,所以使用偏移量來啓動地址可以使事情變得更容易。


如果你的數組大小變化頻繁,那麼你可能會分配一個更大的內存,記住它的大小,並對其重新分配達到該大小時,才調整大小時你也給比了新的價值更大的價值。

您可以在調整大小時選擇一個因子,例如factor = 1.5,表示:new_size = old_size * factor

+0

好吧,那是realloc如何工作,但你認爲我需要做什麼? – motis10

+0

@ user1703871我更新了我的答案。只要你明白實際發生的事情,你就會知道該怎麼做。 –