簡體   English   中英

獲取結構中零長度數組元素類型的大小

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM