sizeof () применяется к структуре и переменной - PullRequest
6 голосов
/ 09 сентября 2011

рассмотрим следующий фрагмент:

struct foo {
  int a;
  int b;
  int c;
};

struct foo f;
printf("%u, %u\n", sizeof(struct foo), sizeof(f));

Код возвращает те же значения, но мне было интересно, если sizeof () применяется к переменной правильно или это просто совпадение?

Спасибо.

Ответы [ 4 ]

6 голосов
/ 09 сентября 2011

Оба будут и должны действительно возвращать одно и то же значение.

Из MSDN:

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

sizeof unary-expression  
sizeof ( type-name )
5 голосов
/ 09 сентября 2011

sizeof работает с типами и выражениями . Когда вы применяете его к типу, () являются частью синтаксиса sizeof: sizeof(type). Когда вы применяете его к выражению () не являются частью синтаксиса sizeof: sizeof expression.

То есть ваш второй sizeof на самом деле «не применяется к переменной». Применяется к выражению (f). Это выражение состоит из одной переменной f, заключенной в избыточную пару (). Вы также можете обойтись без этой избыточной пары () и использовать просто sizeof f.

Когда sizeof применяется к выражению, оно возвращает размер результата выражения (т. Е. Размер типа, который имеет выражение). В вашем примере оба приложения sizeof гарантированно оценивают одно и то же значение.

На самом деле, хорошая практика программирования - избегать sizeof(type) в максимально возможной степени, то есть предпочитать использовать sizeof expression. Это делает ваш код более независимым от типа, что всегда хорошо. Имена типов принадлежат декларациям и больше нигде.

1 голос
/ 09 сентября 2011

Это, как и ожидалось, то есть оба возвращают одно и то же значение. Это значение рассчитывается во время компиляции.

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

0 голосов
/ 09 сентября 2011

В общем случае предпочтительно применять его к переменной.Тогда он останется верным, если тип переменной изменится.

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