2011-07-18 59 views
6

我有以下類型的代碼:靈活的數組成員是否會增加結構的大小?

typedef struct 
{  
    u32 count; 
    u16 list[]; 
} message_t; 
... 

message_t* msg = (message_t*)buffer; 
msg->count = 2; 
msg->list[0] = 123; 
msg->list[1] = 456; 

size_t total_size = sizeof(*msg) + sizeof(msg->list[0]) * msg->count; 

send_msg(msg, total_size); 

問題的行與sizeofs行。我不確定是否需要計算所需空間的正確方法。 sizeof(*msg)是否包含list成員的一些信息?

我可以用我的編譯器測試它,但是在這種情況下每個編譯器的工作是否相似?

+1

取決於對齊 –

+0

@Mitch小麥:是的,你是對的。您的評論是標題問題的正確答案。爲你+1。 – SKi

回答

9

下面是標準的說:

作爲一個特殊的情況下,與一個以上的 命名成員結構的最後一個元素可以有一個不完整的數組類型;這被稱爲 靈活的陣列成員。在大多數情況下,可變數組成員 將被忽略。特別是,該結構的大小就好像 彈性陣列成員被省略了,只是它可能有更多的 尾部填充比省略暗示的要多。

+0

哦哇忘了那...修復我的答案... – ShinTakezou

+0

但是,幫助我們解釋它:它是否意味着sizeof結構+ sizeof列表*元素的數量將給出正確的大小的「對象」,方式的OP計算它,或者這樣可能會錯過「奇怪」的填充? – ShinTakezou

+0

謝謝。標準的引用回答了我的問題。我會接受這個答案。 關於填充:原因「*除了它可能有更多的尾部填充比遺漏將暗示*」 有意義的意思是sizeof(結構)可以是不同的靈活的數組成員。但在我的情況下,這不是一個問題。 – SKi

1

你的例子做的工作,因爲C沒有數組,當你添加元素動態變得更大。因此,* msg的大小是sizeof u32 + paddings(如果有的話),但它不會計入列表成員,在您「分配」緩衝區時您必須考慮自己,以及您想知道該「對象「,就像你一樣。

相關問題