gnuc中的可变长度结构

时间:2011-07-12 08:06:34

标签: c linux struct

是否能够在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;

但是上述用法需要在结构的尾部放置可变长度字段。 如果他们在中间怎么办?

3 个答案:

答案 0 :(得分:4)

中间不能有一个包含多个变量数组或变量数组的结构。想一想,如果长度field3是可变的,编译器将如何知道field4field2的开始位置?

如果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)

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

答案 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