繁体   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