它能够在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
的长度是可变的,编译器如何知道field3
和field4
起始位置?
如果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;
不可能,因为编译器(负责和)将无法计算field4
和field5
偏移量。
你需要用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