gpt4 book ai didi

c - sizeof() 具有零长度数组成员的结构

转载 作者:行者123 更新时间:2023-12-04 23:12:00 25 4
gpt4 key购买 nike

我对 sizeof() 感到困惑C 中的输出。说我有:

struct foo {
char a;
char b;
char c;
char d[0];
};

我希望 sizeof(struct foo)应该是4,但是用gcc编译后返回3。此外,在使用严格设置编译代码时 -pedantic-errors ,我收到编译器错误。

有人可以帮助我理解这种行为吗?

最佳答案

数组大小为 0 是不合法的。 C standard 的第 6.7.6.2p1 节关于 Array Declarators 状态:

In addition to optional type qualifiers and the keyword static , the [ and ] may delimit an expression or * . If they delimit an expression (which specifies the size of an array), the expression shall have an integer type. If the expression is a constant expression, it shall have a value greater than zero. The element type shall not be an incomplete or function type. The optional type qualifiers and the keyword static shall appear only in a declaration of a function parameter with an array type, and then only in the outermost array type derivation.



所以因为这违反了一个约束,这个定义调用了 undefined behavior .

话虽如此,一些编译器允许零长度数组作为 struct 的最后一个成员。作为扩展。 GCC does this .在这种情况下,它的工作方式与灵活的数组成员相同。

执行此操作的标准兼容方法是将大小留空:
struct foo {
char a;
char b;
char c;
char d[];
};

在这两种情况下,灵活的数组成员都不包含在结构的大小中,这就是为什么你得到 3 的大小而不是 4(尽管结构中填充的存在取决于实现)。这也意味着这样的结构不能是数组的成员(至少在没有一些可疑的手动指针操作的情况下不能)。

使用这种结构的方式是为其动态分配空间以及最后一个成员的多个元素。例如:
struct foo *my_foo = malloc(sizeof(*my_foo) + (sizeof(char) * number_of_elements));

关于c - sizeof() 具有零长度数组成员的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57926730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com