具有struct hack的结构数组

use*_*567 1 c

假设我在C中有这样的结构

struct A {  
int len;  
char s[1];  
}
Run Code Online (Sandbox Code Playgroud)

我想拥有一个上面结构的数组,但char s[1]结构A的成员可以是可变长度.我们应该怎么做?即使是C99中的struct hack技巧似乎也不适用于此.一种解决方案是char *作为最后一个成员并进行动态内存分配,但我希望所有数据都struct在连续的位置,因为我的实现需要缓存不经意.

Jon*_*ler 5

您不能拥有可变大小对象的数组,因此您不能使用struct hack拥有结构数组.数组中的所有对象必须具有相同的大小.如果它们的大小都相同,那么结构必须隐含大小,所以你毕竟不会使用struct hack; s在你的结构中,数组的维度中将有一个不是1的大小(除非1对于所有内容都足够大).原因是a[i](a数组的名称和数组i的索引)的存储位置必须可以计算为' a加号的字节地址(i数组中一个对象的大小)'.因此,必须知道并修复数组中对象的大小(在本例中为结构).

作为替代方案,您可以拥有一个指向可变大小对象的指针数组; 您只需安排以适当的大小分别分配每个对象,并将指针保存到数组中的指针.

请注意,C99取消了'struct hack'(虽然在实践中它从未正式移植),并引入了"灵活的阵列成员":

struct A {  
    int  len;  
    char data[];  
};
Run Code Online (Sandbox Code Playgroud)

但是,上述建议仍然适用.