2011-12-14 74 views
1

我犯了這樣的一個結構:的malloc在C,結構

struct a{ 
    char *name; 
    char *value; 
    struct a *next; 
}; 

時,我的malloc在第一次內存,沒關係,我可以設置「名稱」和「價值」的相應值。 但是當我第二次malloc時,錯誤來了。這是一個CGI,只是告訴我「500內部服務器錯誤」。

我將指針'name'和'value'改爲數組,一切正常。

我想也許編譯器不知道要分配多少內存。

你有什麼想法嗎?我會感謝每一個答案!

+5

你將不得不展示更多的代碼 - 你直接存儲在值`a-> name`或`a-> value`中,還是爲_them_分配內存? – sarnold 2011-12-14 01:41:26

+0

我直接存儲值而不分配內存。正如Keith Thompson評論的那樣,我爲a-> name和a-> value分配內存,它的工作原理。你知道這有什麼區別嗎?謝謝! – trinity 2011-12-14 03:22:57

回答

2

如果您使用mallocsizeof(struct a)它只是分配足夠的空間來存儲指針的名稱和值。你希望這些是char數組,然後它會知道爲每個a的實例預留了多少空間。

+0

謝謝你,LaceySnr。你比我有更好的理解。這變得很清楚。 – trinity 2011-12-14 02:12:45

3
struct a { 
    char *name; 
    char *value; 
    struct a *next; 
}; 

struct a *head = malloc(sizeof *head); 

單個struct a對象上面的分配空間,但它不初始化任何HTE的包含在struct a三個指針。特別是,如果你想namevalue指向字符串,則需要對這些字符串分配空間:

head->name = malloc(5); 
strcpy(head->name, "Fred"); 
head->value = malloc(8); 
strcpy(head->value, "abcdefg"; 

這大大簡單化。 58是「幻數」;如果更改初始值,應該以保持一致的方式指定大小。你應該總是檢查malloc()是否返回一個空指針(即使你只是用一個錯誤信息終止程序)。

如果不初始化namevalue指向分配的內存塊一些,你威力仍然能夠初始化它們指向什麼(例如,通過執行上面的strcpy•不用的malloc S)。更確切地說,系統不一定會診斷錯誤。

最後,您需要致電free()對應每個malloc()調用。

請注意,這主要是根據您的描述猜測。如果您可以向我們顯示您的實際代碼,我們可以幫助您更好。