Определить размер структуры в C

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

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

2 ответа

Решение

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

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). Компилятор игнорирует заполненные байты.

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

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

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

Другие вопросы по тегам