Определить размер структуры в 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.