[英]Getting the size of the type of a zero-length array element in a structure
也許標題令人困惑,但想法很簡單。 給定以下結構:
struct z {
uint64_t _a;
uint64_t _b;
struct {
char _c[64];
uint64_t _d;
} data[0];
} __attribute__((packed));
如何獲得匿名內部結構data
類型的大小? 我不想命名結構並使命名空間混亂,但在data
序列化緩沖區的總長度時,我確實需要它的大小。
如果你嘗試這個,你會發現類似的東西:
struct z *p;
sizeof(struct z) == 16
sizeof(*p) == 16
sizeof(p->data) == 0
這些結果是預期的。 但是,我希望看到的是以下內容:
sizeof(typeof(p->data)) == 72
但是,不幸的是,我仍然得到
sizeof(typeof(p->data)) == 0
我認為這可能是因為該結構未命名,但在為其提供名稱后,您會發現早期的結果仍然正確。
有沒有辦法獲得匿名內部零長度結構的大小?
我會使用:
sizeof(p->data[0])
因為它在sizeof
內部,因此沒有被評估,所以p->data[0]
實際上並沒有取消引用p->data
。 編譯器只計算出類型。
但是在計算帶有非零數據預告片的序列化緩沖區的總長度時,我確實需要它的大小
你不能用sizeof()
做到這一點。 您必須自己跟蹤大小。
根據 GCC 文檔(我的粗體字 - 請注意):
在 GNU C 中允許聲明零長度 arrays 作為擴展。 零長度數組可用作結構的最后一個元素,該結構實際上是 header,用於可變長度 object:
struct line { int length; char contents[0]; }; struct line *thisline = (struct line *) malloc (sizeof (struct line) + this_length); thisline->length = this_length;
盡管長度為零的數組的大小為零,但由於尾部填充,這種數組成員可能會增加封閉類型的大小。 ...
請注意示例代碼如何跟蹤數組中的元素數量。
只是命名它。 如果不是說
struct {
char _c[64];
uint64_t _d;
} data[0];
你說
struct data {
char _c[64];
uint64_t _d;
} data[0];
然后sizeof(struct data)
會告訴你它的 sizeof。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.