struct a
{
char *c;
char b;
};
Что такое sizeof (a)?
struct a
{
char *c;
char b;
};
Что такое sizeof (a)?
#include <stdio.h>
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. Если вы это сделаете, будьте осторожны с упаковкой reset перед любыми заголовками библиотеки!
Вопреки тому, что говорили некоторые другие ответы, в большинстве систем, в отсутствие параметра прагмы или компилятора, размер структуры будет не менее 6 байтов, а в большинстве 32-битных систем - 8 байтов, Для 64-битных систем размер может быть легко равен 16 байтам. Согласование вступает в игру; всегда. Размер одной структуры должен быть таким, чтобы можно было выделить массив этих размеров, и отдельные члены массива достаточно выровнены для рассматриваемого процессора. Следовательно, если размер структуры равен 5, как предполагают другие, тогда массив из двух таких структур будет иметь длину 10 байтов, а указатель char во втором элементе массива будет выровнен по нечетному байту, который будет ( на большинстве процессоров) вызывают серьезное узкое место в производительности.
Если вы хотите вручную подсчитать его, размер структуры будет равен размеру каждого из своих членов данных после учета выравнивания. Нет никаких магических служебных байтов для структуры.
Точное значение sizeof (a).
Вы также можете взять на себя риск и предположить, что в этом случае не менее 2 и не более 16.
Это зависит от вашей архитектуры и того, как она относится к базовым типам данных. Это также будет зависеть от того, требует ли система естественного выравнивания.
Я предполагаю, что вы имеете в виду структуру, а не строгую, но в 32-битной системе это будет либо 5, либо 8 байтов, в зависимости от того, компилятор заполняет структуру.
Я подозреваю, что вы имеете в виду "struct", а не "strict" и "char" вместо "char".
Размер зависит от реализации. В большинстве 32-битных систем для указателя, вероятно, будет 5-4 байта, один для char. Я не верю, что вступление здесь в действие. Однако, если вы поменяли 'c' и 'b', размер может увеличиться до 8 байтов.
Хорошо, я попробовал (g++ 4.2.3, с опцией -g), и я получил 8.
Размер структуры должен быть 8 байтов в 32-битной системе, так что размер структуры становится кратным 2. Это делает отдельные структуры доступными при правильных байтовых границах при объявлении массива структур. Это достигается добавлением структуры с 3 байтами в конце.
Если у структуры был указатель, объявленный после char, он все равно будет иметь размер 8 байтов но добавление 3 байтов было бы добавлено, чтобы сохранить указатель (который представляет собой элемент 4 байта), выровненный по границе 4 байтов.
Правило большого пальца состоит в том, что элементы должны иметь смещение, которое является кратным их размеру байта, а сама структура должна иметь размер, который кратен 2.