【问题标题】:variable length struct in gnucgnuc中的可变长度结构
【发布时间】:2011-10-03 10:06:05
【问题描述】:

是否可以在 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;

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

【问题讨论】:

    标签: c linux struct


    【解决方案1】:

    你不能有一个结构体,其中包含多个变量数组或一个变量数组。想想看,如果长度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;
    

    【讨论】:

      【解决方案2】:

      您需要使用 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
      

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 如果将那些可变长度字段的长度添加到这个结构中怎么办?我已经改变了结构。
        • 更具体地说,生成操作以读取字段长度并为后面的字段使用适当的偏移量是绝对微不足道的但 C 没有这样做的能力。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-04
        • 1970-01-01
        • 2014-11-14
        • 2013-11-26
        • 2015-08-09
        相关资源
        最近更新 更多