gpt4 book ai didi

c - C 结构末尾有两个零长度数组成员

转载 作者:行者123 更新时间:2023-11-30 15:48:55 26 4
gpt4 key购买 nike

我知道零长度数组的用法,我想知道以下是否可以接受

struct foo {

int id_num;
bool is_person;
char person_name[0];
char product_name[0];

}foo;

and allocating as follows

#define NAME_SIZE 100

struct foo *data = (struct foo\*)malloc(sizeof(struct foo) + NAME_SIZE);

我有上面的结构,用于表示一个人。现在我想使用相同的结构来表示产品。该结构将根据 is_person 标志引用产品或人员。我不想将最后一个成员放入 union 中,因为这将涉及现有代码库中的大量代码更改。于是我按照上面的方法修改了一下,就编译通过了。我想知道这是否是正确的用法,因为我要么将其用作人,要么将其用作产品,而不是两者都使用,并且我不想将变量名称更改为类似于 char person_or_product_name[0].我还假设 person_nameproduct_name 充当同一内存区域的标识符。

最佳答案

I am also assuming that person_name and product_name acts as identifiers to the same region of memory.

正是如此。这就是这里的实际问题:零长度数组是否占用零空间。如果没有,你就完蛋了。

C++ 标准 #9.2(12) 说“后面的成员在类对象中具有更高的地址”,而 #9(4) 说“结构是一个类...”,因此,除非 C 标准是在这方面有所不同,它不占用零空间:在 person_name 之后有填充,可能到下一个 4 字节边界(编译器和 #pragma- 以及选项相关)。

您可以通过以下方式进行测试

struct foo f;
assert(&f.person_name == &f.product_name);

关于c - C 结构末尾有两个零长度数组成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16577217/

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