2013-04-03 73 views
-3

編輯 - 以前發佈的代碼醞釀,因爲它不會編譯結構哈克與結構類型的數組

說我有結構黑客以下變種:

typedef struct hack *Hack; 
struct hack { 
    char* value; 
    Hack arr[1]; 
}; 

究竟我應該mallocing?我應該做這樣的事情:

malloc(sizeof(struct hack) + sizeof(struct hack)*(numElems-1)); 

可能縮短爲:

malloc(sizeof(struct hack) * numElems); 

是正確的嗎?

+3

無法工作,'struct'不能包含相同類型的成員或其數組。 – 2013-04-03 20:51:29

+0

你的struct [不會編譯](http://liveworkspace.org/code/3kyOil$0) – 2013-04-03 20:51:51

+0

我已經用typedef struct hack * Hack測試過它,但不是隻用typedef struct hack Hack,你指出的幾個正確的不編譯。但是,我的問題仍然代表* Hack。 – Kvass 2013-04-03 20:55:26

回答

1

我不認爲你的第一個代碼是正確的。這是「不完整的元素類型」

typedef struct hack Hack; 
struct hack { 
    char* value; 
    Hack arr[1]; 
}; 

等於:

struct hack { 
    char* value; 
    struct hack arr[1]; /* Here wrong */ 
}; 

在錯的時候,你嘗試定義的struct hack但數組:struct hack的定義是不完整然而。哦,你修改它。

爲了您的新代碼,它應該是:

typedef struct hack *Hack; 
struct hack { 
    char* value; 
    Hack arr; 
}; 
Hack node = malloc(sizeof(struct hack)); 
node->arr = malloc(sizeof(struct hack) * numElems); 

在這種情況下,「節點」是指向單一結構的黑客。而這個實體的成員「arr」是另一個結構hack陣列。否則,您可以將您的數據構建爲典型的鏈接列表。

更新:關注,節點中的所有值和(node->arr)[i]都未初始化!在malloc()之後,您應該將memset()全部設爲零。或者確保在使用前分配一個有效的值。如果您在分配有效值之前使用它,那麼滿足分段錯誤是最好的。在更糟糕的情況下,花費你的時間來找出哪裏出錯。

+0

這一切都是有道理的 - 這樣做後,我可以安全地獲得和設置(節點 - > ARR)[我]爲0 <=我 Kvass 2013-04-03 21:04:50

+0

由此我的意思是設置,然後設置後;首先沒有設置應該segfault正確? – Kvass 2013-04-03 21:05:38

+0

是的,你可以使用「(node-> arr)[i]爲0 <= i arr)[i]中的所有值都沒有初始化! memset()它們全部在malloc()之後立即爲零,或者確保在任何使用前分配一個有效值,如果在分配有效值之前使用它,這是滿足段錯誤的最好辦法。 ,它會花費你的時間來找出錯在哪裏。 – Sheng 2013-04-03 21:10:45