Как найти размер структуры?

struct a { char *c; char b; }; 

Что такое sizeof (a)?

 #include  typedef struct { char* c; char b; } a; int main() { printf("sizeof(a) == %d", sizeof(a)); } 

Я получаю «sizeof (a) == 8» на 32-битной машине. Общий размер структуры будет зависеть от упаковки: в моем случае по умолчанию упаковка равна 4, поэтому «c» занимает 4 байта, «b» принимает один байт, оставляя 3 байта заполнения, чтобы довести его до следующего кратного 4 : 8. Если вы хотите изменить эту упаковку, большинство компиляторов имеют способ ее изменить, например, на MSVC:

 #pragma pack(1) typedef struct { char* c; char b; } a; 

дает sizeof (a) == 5. Если вы это сделаете, будьте осторожны, чтобы сбросить упаковку перед любыми заголовками библиотеки!

Вопреки тому, что говорили некоторые другие ответы, в большинстве систем, в отсутствие параметра прагмы или компилятора, размер структуры будет составлять не менее 6 байтов, а в большинстве 32-разрядных систем – 8 байтов. Для 64-битных систем размер может быть легко равен 16 байтам. Согласование вступает в игру; всегда. Размер одной структуры должен быть таким, чтобы можно было выделить массив этих размеров, и отдельные члены массива достаточно выровнены для рассматриваемого процессора. Следовательно, если размер структуры равен 5, как предполагают другие, тогда массив из двух таких структур будет иметь длину 10 байтов, а указатель char во втором члене массива будет выровнен по нечетному байту, который будет (на большинстве процессоры) вызывают серьезное узкое место в производительности.

Если вы хотите вручную подсчитать его, размер структуры будет равен размеру каждого из своих членов данных после учета выравнивания. Для структуры нет магических служебных байтов.

Точное значение – sizeof (a) .
Вы также можете взять на себя риск и предположить, что в этом случае не менее 2 и не более 16.

Это зависит от вашей архитектуры и того, как она относится к базовым типам данных. Это также будет зависеть от того, требует ли система естественного выравнивания.

Я предполагаю, что вы имеете в виду структуру, а не строгую, но в 32-битной системе это будет 5 или 8 байт, в зависимости от того, компилятор заполняет структуру.

Я подозреваю, что вы имеете в виду «struct», а не «strict» и «char» вместо «Char».

Размер будет зависимым от реализации. В большинстве 32-битных систем для указателя, вероятно, будет 5-4 байта, один для символа. Я не верю, что вступление здесь в действие. Однако, если вы поменяли ‘c’ и ‘b’, размер может вырасти до 8 байтов.

Хорошо, я попробовал это (g ++ 4.2.3, с опцией -g), и я получаю 8.

Размер структуры должен быть 8 байтов в 32-битной системе, так что размер структуры становится кратным 2. Это делает отдельные структуры доступными с правильными байтовыми границами при объявлении массива структур. Это достигается добавлением структуры с 3 байтами в конце.

Если у структуры был указатель, объявленный после символа, размер будет по-прежнему составлять 8 байтов, но добавление 3 байтов было бы добавлено, чтобы сохранить указатель (который является 4-байтным элементом), выровненный по границе 4-байтового адреса.

Эмпирическое правило состоит в том, что элементы должны иметь смещение, которое является кратным размеру их байтов, а сама структура должна иметь размер, который кратен 2.