是否能够在gnuc中定义一个可变长度结构来表示对象,如下所示:
field1: fixed 4bytes;
field2: length of field3
field3: variable length
field4: length of field5
field5: variable length
field6: fixed 8bytes
field7: fixed 1byte
我知道在gnuc中我们可以使用零大小的数组来实现一个可变长度的结构,例如
typedef struct varStruct{
int foo1;
int foo2[0];
}varStruct;
但是上述用法需要在结构的尾部放置可变长度字段。 如果他们在中间怎么办?
答案 0 :(得分:4)
中间不能有一个包含多个变量数组或变量数组的结构。想一想,如果长度field3
是可变的,编译器将如何知道field4
和field2
的开始位置?
如果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;
答案 1 :(得分:2)
不可能,因为编译器(负责和)将无法计算field4
和field5
的偏移量。
答案 2 :(得分:1)
您需要使用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