Определить размер структуры в C - PullRequest
8 голосов
/ 03 января 2012

По разным причинам у меня есть некоторые структуры, которые я хочу заставить быть определенными размерами (в данном случае 64 байта и 512 байтов). Оба, однако, ниже несколько ниже размеров, которые я хочу, чтобы они были.

В любом случае могу ли я сказать компилятору установить их на эти конкретные размеры и заполнить нулями, или лучше было бы просто объявить массив внутри структуры, который составляет избыточное пространство, чтобы он выравнивался по размеру Я хочу?

Ответы [ 2 ]

18 голосов
/ 03 января 2012

Вы можете использовать союз.

struct mystruct_s {
    ... /* who knows how long */
};

typedef union {
    struct mystruct_s s;
    unsigned char padding[512];
} mystruct;

Это обеспечит объединение 512 байт или более. Затем вы можете убедиться, что это не более 512 байт, используя статическое утверждение где-то в вашем коде:

/* Causes a compiler error if sizeof(mystruct) != 512 */
char array[sizeof(mystruct) != 512 ? -1 : 1];

Если вы используете C11, есть лучший способ сделать это. Я не знаю никого, кто использует C11 еще. Стандарт был опубликован несколько недель назад.

_Static_assert(sizeof(mystruct) == 512, "mystruct must be 512 bytes");

Обратите внимание, что единственный способ дополнить нулями - это поставить нули туда вручную (calloc или memset). Компилятор игнорирует заполненные байты.

0 голосов
/ 03 января 2012

Я не думаю, что есть какой-либо способ автоматизировать это, по крайней мере, в gcc, который является компилятором, который я использую.Вы должны дополнить свои структуры.

Будьте осторожны с автоматическим выравниванием переменных в вашей структуре.Например, struct example {char a;int b;}

не занимает 5 байтов, но 8.

...