структура переменной длины в gnuc - PullRequest
1 голос
/ 12 июля 2011

Можно ли определить структуру переменной длины в 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 ]

4 голосов
/ 12 июля 2011

Вы не можете иметь структуру с несколькими массивами переменных или массивом переменных в середине. Подумайте об этом, как компилятор узнает, где 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;
2 голосов
/ 12 июля 2011

Невозможно, так как компилятор (отвечает за и) не сможет рассчитать смещения для field4 и field5.

1 голос
/ 12 июля 2011

Вам нужно будет сделать это с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...