struct {
a_struct_t a_member[1];
...
}b_struct;
Thanks in advance
struct {
a_struct_t a_member[1];
...
}b_struct;
Thanks in advance
一般情况下,一个结构体中声明为数组的成员会被放置在结构体的最后一个位置。这是因为该结构体将要被动态地分配内存。当它被分配时,代码将为该数组中需要的元素数量分配空间:
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()
。对于大多数其他类型的项目,通常需要从分配大小中减去一(或仅接受分配的空间比严格必要的空间大一个项目)。
您可以使用指针(类似地)完成相同的操作,但它会导致将结构体的主体与通过指针引用的项目分别分配。好处是(与上述方法不同),可以动态分配多个项目,而上述方法仅适用于结构体的最后一个成员。
您所描述的是完全不同的两件事情。如果您有一个指针作为成员:
a_struct_t* a_member;
如果只是一个指针,那么结构体内部没有分配任何内存来保存 a_struct_t
。另一方面,如果您有一个大小为1的数组:
a_struct_t a_member[1];
那么你的结构体实际上在其内部有一个类型为a_struct_t
的对象。从内存角度来看,它与仅将该类型的对象放置在结构体内并没有多大区别:
a_struct_t a_member;
从使用角度来看,数组需要间接访问其一个元素(即,您需要使用*a_member
而不是a_member
)。
struct thing{ ...};
,然后稍后说struct thing aThing, someThings[thingCount];
。无论哪种方式,声明成员为数组或指针的struct thing
的解释都不同。 - dmckee --- ex-moderator kitten"大小为1的数组而不是指针"?抱歉,但我不明白这个问题怎么可能有意义。如果您问的是关于“大小为1的数组而不是普通成员(非数组)”,那我可以理解。但是“而不是指针”呢?指针与此有什么关系?它如何可替换数组,以证明这个问题?
如果您真正想问的是为什么它被声明为大小为1的数组而不是非数组,就像下面这样:
struct {
a_struct_t a_member;
} b_struct;
struct {
...
a_struct_t a_member[1];
} b_struct;
所以我认为已经说明了指针和数组之间的主要区别在于必须为指针分配内存。
你问题的棘手之处在于,即使你为结构体分配了空间,如果你的结构体包含一个指针,你还必须为指针再次分配内存,但指针本身将作为结构体分配的一部分而被分配。
如果你的结构体包含一个长度为1的数组,则无需分配任何额外的内存,它将存储在结构体中(你仍然需要为结构体分配内存)。