2017-01-23 100 views
0

我有一個動態的結構,像這樣:char **應該是malloc大小(char *)還是char *字符串長度的大小?

struct network { 
    int count; 
    char** ips; 
} 

如果我知道每個字符串數組是16個字節(即INET_ADDRSTRLEN。),因爲他們是IPv4地址,它的問題,如果我有sizeof(char*) * countsizeof(char) * INET_ADDRSTRLEN * count分配?

例如:

// n is a pointer to a network 

n->ips = realloc(n->ips, sizeof(char*) * n->count); 

for (int i =0; i< n->count; i++){ 
    n->ips[i] = malloc(INET_ADDRSTRLEN); 
    strcpy(n->ips[i], "127.0.0.1"); 
} 

OR

n->ips = realloc(n->ips, sizeof(char) * INET_ADDRSTRLEN * n->count); 

for (int i =0; i< n->count; i++){ 
    n->ips[i] = malloc(INET_ADDRSTRLEN); 
    strcpy(n->ips[i], "127.0.0.1"); 
} 

而且,如果我做的第二種方式,做我需要做n->ips[i] = malloc(INET_ADDRSTRLEN);

+3

是的,它很重要,你使用。你需要分配一個指針數組,以及指向指針的數據。數據空間可能是單個分配或多個較小的分配;您可以通過任何方式適當地設置指針。 (只要您小心,單個分配可能會更好。)這由'char **'類型(符號)控制。如果你玩'char(* ips)[16];',答案會不同。 –

回答

3

ips指向一個char *數組,因此它的緩衝區必須是sizeof(char *)的倍數,而不是sizeof(char)的倍數。

1

對於可靠性,更好的辦法是使用的malloc/realloc慣用形式:

n->ips = malloc(n->count * sizeof(*n->ips))); // n * sizeof(element) 

這樣一來,如果ips類型將改變有一天,你不需要修復代碼在每次發生內存分配函數中。

作爲一個經驗法則,總是檢查內存分配函數的結果,因爲它可能會失敗。

0

在你的代碼中,ips是指向char的指針。所以,當你爲它分配內存時,你需要爲指向char的指針分配空間。這意味着你的第一個例子是正確的。

腳註:我假設其他地方有代碼將ips初始化爲像NULL這樣的值。對隨機垃圾做realloc是一個壞主意。如果這不是實際的重新分配,請考慮使用malloc代替。如果這是一個真正的重新分配,那麼你有一個內存泄漏,因爲數組中的計數指針正在被新緩衝區替換而不釋放先前的緩衝區。

最後,我認爲你需要malloc INET_ADDRSTRLEN + 1爲尾部空字符保留空間。

+0

16 = 3 +'。' + 3 +'。' + 3 +'。' + 3 +'\ 0';額外的'+ 1'不是必須的,因爲'INET_ADDRSTRLEN'被設計成使它不必要。 –