结构体的使用方式有时存在一些缺点,如果您不考虑其中的含义,可能会很危险。
对于你的例子,如果你启动一个函数:
void test(void) {
struct header;
char *p = &header.data[0];
...
}
然后结果是不确定的(因为没有为数据分配存储空间)。您通常会意识到这一点,但在某些情况下,C 程序员可能习惯于将值语义用于结构,这会以各种其他方式分解。
例如,如果我定义:
struct header2 {
int len;
char data[MAXLEN]; /* MAXLEN some appropriately large number */
}
然后我可以简单地通过赋值复制两个实例,即:
struct header2 inst1 = inst2;
或者如果它们被定义为指针:
struct header2 *inst1 = *inst2;
但这不适用于灵活的数组成员,因为它们的内容不会被复制。您想要的是动态 malloc 结构的大小并使用 memcpy 或等效项复制数组。
struct header3 {
int len;
char data[]; /* flexible array member */
}
同样,编写一个接受struct header3 的函数将不起作用,因为函数调用中的参数再次按值复制,因此您将得到的可能只是灵活数组成员的第一个元素。
void not_good ( struct header3 ) ;
这并不是一个坏主意,但您必须牢记始终动态分配这些结构,并且只将它们作为指针传递。
void good ( struct header3 * ) ;