Как работает функция sizeof () для структур в C? - PullRequest
6 голосов
/ 04 января 2012

Структура определяется следующим образом

typedef struct Sample
{
  int test;
  char strtest;
} Sample;

В основной функции я вызвал Sizeof структуры.

sizeof(struct Sample)

Я слышал, что возвращаемое значение sizeof для структур может быть неправильным. Если это так, что я должен сделать, чтобы получить правильное значение?

Ответы [ 4 ]

22 голосов
/ 04 января 2012

Возвращает надежное значение, но не всегда ожидаемое значение.

В структуре Sample вы предполагаете 1-байтовый символ и 4-байтовый int, но вы не получите результат "5".

Потому что структура дополняется так, что элементы начинаются на своих естественных границах. у вас больше шансов получить результат «8».

Вики объясняет это довольно хорошо: http://en.wikipedia.org/wiki/Sizeof - в "Structure Padding", около дна.

1 голос
/ 04 января 2012

sizeof с типом структуры работает как с любым другим типом: результатом оператора является размер типа в байтах. Размер типа структуры такой же, как размер объекта этого типа структуры.

Размер sizeof объекта структуры может превышать размер различных элементов типов структуры из-за заполнения.

Может быть заполнение неопределенным числом байтов после каждого элемента структуры, и дополнение учитывается в размере типа структуры (или объекта типа структуры)

Чтобы напечатать размер структурного типа, используйте спецификатор преобразования z в строке формата printf:

printf("%zu\n", sizeof (struct my_structure_type));
1 голос
/ 04 января 2012

Sizeof не является функцией;это оператор .Его результат всегда верен, но иногда неожиданен из-за заполнения или убеждения, что это определитель размера магического массива.

Как оператор, скобки не нужны, если они действуют в переменной.

 int foo;
 printf("%zu\n", sizeof foo);

совершенно законно.

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

Здесь вы можете прочитать немного больше об этом: http://somectips.wordpress.com/2012/01/05/what-is-the-size-of-struct/

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