将C结构成员声明为大小为1而不是指针的数组有什么好处:
struct {
a_struct_t a_member[1];
...
}b_struct;
提前致谢
答案 0 :(得分:5)
在典型情况下,具有声明为一个项目数组的成员的结构将该成员作为结构中的 last 项。目的是动态分配结构。分配时,代码将为该数组中您真正想要/需要的项目分配空间:
struct X {
time_t birthday;
char name[1];
};
struct X *x = malloc(sizeof(*x) + 35);
x->birthday = mktime(&t);
strcpy(x->name, "no more than 35 characters");
这对字符串特别有用 - 你在结构中分配的字符为NUL终结符提供了空间,因此当你进行分配时,你分配的字符数恰好是strlen()
的你要放在那里的字符串。对于大多数其他类型的项目,您通常希望从分配大小中减去一个(或者仅使用分配的空间大于一个大于严格必要的项目)。
您可以使用指针执行(排序)相同的操作,但是它会导致将结构体分配给您通过指针引用的项目。好处是(与上述方法不同)可以动态分配多个项目,其中上述方法仅适用于结构的最后一个成员。
答案 1 :(得分:2)
你所描述的完全是两件事。如果你有一个指针作为成员:
a_struct_t* a_member;
然后它只是一个指针。结构内部没有分配内存来保存a_struct_t
。另一方面,如果你有一个大小为1的数组:
a_struct_t a_member[1];
然后你的struct实际上有一个类型为a_struct_t
的对象。从内存的角度来看,它与仅在结构中放置该类型的对象没有多大区别:
a_struct_t a_member;
从使用角度来看,数组需要间接访问一个元素(即,您需要使用*a_member
而不是a_member
)。
答案 2 :(得分:2)
“大小为1而不是指针的数组”?对不起,但我不明白这种静止是否有意义。如果你问“大小为1的数组而不是普通的成员(非数组)”,我会理解。但“而不是指针”?指针与此有什么关系?它如何与数组互换,以证明这个问题的正确性?
如果您真正想问的是为什么它被声明为大小为1而不是非数组的数组,如
struct {
a_struct_t a_member;
} b_struct;
然后一个可能的解释是众所周知的成语叫做“struct hack”。您可能会看到像
这样的声明struct {
...
a_struct_t a_member[1];
} b_struct;
用于实现灵活大小的数组作为struct对象的 last 成员。稍后在内存块中创建实际的struct对象,该内存块足够大以容纳所需数量的数组元素。但在这种情况下,数组必须是结构的 last 成员,而不是示例中的第一个。
P.S。有时您可能会看到通过大小为0的数组实现“struct hack”,这实际上是C中的约束违规(即编译错误)。
答案 3 :(得分:0)
这些是不同的东西。
此成员的名称是已分配内存的地址,在结构实例本身内分配。
答案 4 :(得分:0)
所以我认为已经说过指针和数组之间的主要区别在于你必须为指针分配内存。
关于你的问题的棘手部分是,即使你为你的struct分配空间,如果你的struct包含一个指针,你必须为指针分配一个SECOND时间,但指针本身将被分配为struct的allocaiton的一部分
如果你的struct包含1的数组,你不必分配任何额外的内存,它将存储在struct(你仍然需要分配)中。