gnuc中的可变长度结构

它能够在gnuc中定义一个可变长度的结构来表示一个对象如下:

field1: fixed 4bytes; field2: length of field3 field3: variable length field4: length of field5 field5: variable length field6: fixed 8bytes field7: fixed 1byte 

我知道在GNOME我们可以使用零大小的数组来实现一个可变长度的结构,例如

 typedef struct varStruct{ int foo1; int foo2[0]; }varStruct; 

但是,上面的用法需要将可变长度字段放置在结构的尾部。 如果他们在中间呢?

你不能在中间有一个以上的变量数组或变量数组。 想一想,如果field2的长度是可变的,编译器如何知道field3field4起始位置?

如果field1包含接下来两个字段的长度,则可以手动读取结构的成员。 示例代码(读取为伪代码):

 #define PADDING 8 /* or perhaps sizeof(void *) */ typedef struct { int32_t field_len; char data[0]; } main_str_t; typedef struct { int64_t one; int8_t another; } tail_str_t; .... main_str_t *data = get_data(); int32_t len = data->field_len; int32_t padded_len = ((field_len + PADDING - 1) / PADDING) * PADDING; char *field2 = data->data; char *field3 = field2 + padded_len; tail_str_t *tail = field3 + padded_len; 

不可能,因为编译器(负责和)将无法计算field4field5偏移量。

你需要用3个结构来做到这一点,并在运行时做一些小小的算术运算:

 struct1: field1: fixed 4bytes; field2: length of field3 field3: variable length struct2: field4: length of field5 field5: variable length struct3: field6: fixed 8bytes field7: fixed 1byte