2014-03-31 157 views
0

好的,所以問題基本上就像標題一樣。找不到一個問題,它的所有位,所以我想我會問。分配結構數組中的指針

說我要結構的數組形如以下

typedef struct s_woo{ 
    char** n; 
    char* x; 
} t_woo; 

所以我相信我應該做

t_woo* woos = malloc(num_woos * sizeof(*woos)); 

看起來非常簡單(而且應該從我喊我的習慣震懾人心鑄造malloc)。

然後我想初始化每個結構中的東西。

所以我憑直覺做的:

for(i = 0; i < num_woos; i++){ 

    num_ns = randomint1/randomint2; //let's say num_ns is big, like 250-ish, average, and changes every round of the loop 

    woos[i].n = malloc(num_ns * sizeof(char*)); 
    woos[i].x = malloc(num_ns * sizeof(char)); 
    for(j = 0; j < num_ns; j++){ 
     woos[i].n[j] = malloc(16 * sizeof(char)); // I just want 16 characters per char* 
    } 
} 

這是什麼,我有我的代碼歸結版本。我想知道我寫的東西可能會出什麼問題 - 就像任何可能的事情一樣。我不特別尋找任何東西,只是一般問題與上述,如內存/堆問題,指針錯誤等。

拋出「虛擬內存用盡」。我的代碼錯誤檢查使用malloc上的包裝函數,所以我非常確定不是這樣。

+1

從這裏看起來很好。這將有助於避免編碼錯誤使用定義/常量而不是'16'。我不知道你是否打算在這些數組中存儲字符串,但如果是這樣,不要忘記null結束符。 –

+0

如果你打算進行健壯的設計,你可以使用更多*封裝*,即把't_woo'變成一個獨立的對象。這將涉及將'num_ns'放入't_woo'中,並且具有爲單個't_woo'(以及另一個在後來銷燬)完成所有構建的功能。然後,在你分配內存給它們之後,儘可能快地遍歷你的't_woo'列表,在每個列表中調用構造函數。 –

+0

'並且每輪循環都會改變.. ..您是否在每次循環分配之前釋放內存?也許你的外部循環運行很多次,它會產生內存錯誤。 –

回答

1

更妙的是:

static const size_t woo_n_size = 16; 
    /* To make sure you use 16 everywhere, 
    * also easier to change it 
    */ 

struct woo_item { 
    char n[woo_n_size]; 
    char x; 
}; 

struct s_woo { 
    struct woo_item *items; 
    size_t size;/* optinal, to keep track of item count */ 
} 

隨着woo_item結構可以確保沒有x沒有分配n[woo_n_size],反之亦然。 您可以通過指定null元素來關閉每個列表來記住woo_items的數量,或者只需存儲size成員s_woo