2012-09-27 96 views
0

假設我有一個名爲Thing的結構。如果我想要一個「事物」的數組,但它沒有固定的大小(動態),我該如何爲它分配空間?我最初是否爲數組本身使用malloc空間,然後每次向它添加元素時都必須重新分配空間? 例如:c,malloc和realloc結構數組

struct Thing{ 
    char *stuff; 
    char **morestuff; 
    int evenmorestuff; 
}; 

Thing *thingarray; 
thingarray = malloc(sizeof(Thing)); 

.... 

//And then allocating space for elements, which will get called an unknown amount of times 
Thing j; 
thingarray[count] = j; 

如何設置的malloc和realloc能夠類型的東西儘可能多的元素添加到「物」的陣列?

+1

'Thing' *確實*具有固定大小。它的大小是'char *'的大小。 –

+0

我編輯了Thing結構來顯示它的更多屬性......它會是多大? –

+0

我不會爲每個項目重新分配,每次都以一個常數因子增長數組。 –

回答

3

您可能會想要使用dynamic array策略:記錄其中有多少物品和當前的容量,然後隨時填充容量。您可以獲得分期線性時間和數組的隨機訪問。

0

您可以從NULL指針開始(Thing * thingarray = NULL;),因爲數組中沒有任何內容。

當您添加項目時,您需要爲每個項目分配內存。對於第一個項目使用malloc並對其他項目使用realloc可行。

0

您需要的malloc它一定量的「物聯網」的

說:的malloc(的sizeof(事)* 8),以獲得空間,其中八人。

如果您需要更多空間,您將不得不使用臨時變量重新分配空間。

+0

不,您實際上不必使用臨時變量重新分配空間。標準的'realloc'函數將分配適當的空間量,如果需要則複製舊值,然後返回一個指向新的較大動態數組的指針(它可能與指向舊動態數組的指針相同或不同現在垃圾內存)。 –

+0

呃,我的道歉。我不知道realloc,我一直都是手動完成的。 – Jacobm001

+0

@AdamMihalcin:小心;如果你寫'x = realloc(x,newsize);'和realloc()'失敗,你通常會泄漏內存。你需要使用一些變體:'void * y = realloc(x,newsize);如果(y == 0)...錯誤處理...;其他x = y;'。這可能被解釋爲使用臨時變量; 'y'的持續時間有限。 –

-1

如果可以,請嘗試使用動態數組的向量。它會爲你節省很多時間,你不必擔心分配:

#include <vector> 
using namespace std; 

struct Thing 
{ 
    char *stuff; 
    char **morestuff; 
    int evenmorestuff; 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    vector<Thing> vt; 

    char stuff = 'a'; 
    char *morestuff = "abc"; 

    Thing t; 
    t.stuff = &stuff; 
    t.morestuff = &morestuff; 
    t.evenmorestuff = 0; 

    int count = 10; 
    for (int i = 0; i <= count; ++i) 
    { 
     t.evenmorestuff = i; 
     vt.push_back(t); 
    } 

    Thing j; 
    j.stuff = &stuff; 
    j.morestuff = &morestuff; 
    j.evenmorestuff = 0; 

    vt[count] = j; 

    return 0; 
} 
+0

歡迎來到Stack Overflow。有趣的代碼;問題標記爲C,但您的代碼使用C++標頭和標記。如果您將代碼標記爲「這是您如何使用C++編寫代碼」,那麼您可以避免這種情況,但是如果沒有這種表示法,人們可能會變得脾氣暴躁。 '_tmain()'也有點問題;你應該可以診斷出這可以在Windows上運行,但不能在其他地方運行。如果你修改了什麼'stuff'或'morestuff'點,你會遇到這個代碼的問題嗎?解決這個問題可能需要構造函數等等在''struct''中。 –

+0

-1您可能已經發布了Python或Ruby代碼......這些代碼同樣重要。 –

+1

@Jonathan,謝謝你的評價,下次我會更好的瞭解。 –