“C” sizeof с типом или переменной

21
задан Josh Lee 22 December 2009 в 05:10
поделиться

6 ответов

Если тип переменной будет изменен, sizeof не потребует изменения, если переменная будет аргументом, а не типом.

Относительно комментария @icepack: возможность или вероятность изменения для типа по сравнению с именем переменной не являются проблемой. Предположите, что имя переменной используется в качестве аргумент sizeof и затем позже изменилось. В лучшем случае осуществление рефакторинг - переименовывает операционные изменения, все случаи и никакая ошибка представлены. В худшем случае пропущен экземпляр sizeof, и компилятор жалуется, и Вы фиксируете его. Если тип изменяется, Вы сделаны, никакая возможность ошибок в sizeof операторах.

Теперь предполагают, что тип является аргументом sizeof. Если тип переменной изменяется, нет никакого средства кроме контроля для нахождения всего sizeof, касающегося той переменной. Можно искать, но Вы получите хиты для всего несвязанного использования sizeof того же типа. Если по Вам будут скучать, у Вас будет проблема во время выполнения из-за несоответствия размера, которое является намного большей проблемой для нахождения.

47
ответ дан Steve Fallows 29 November 2019 в 06:35
поделиться

В дополнение к тому, что говорит Steve, позвольте мне добавить, что sizeof не оценивает свой операнд. Таким образом, Вы свободны сделать что-либо в нем. Не только Вы еще не можете использовать инициализированные переменные, но и можно разыменовать нулевого указателя, вызвать функции, не определенные, но только заявленные, и сделать любой другой вид материала. Я поощряю Вас всегда использовать версию выражения по причинам, которые Steve объяснил значительно.

Также полагают, что иногда имена типов действительно долги и нечитабельны, просто думают об указателях на функции (особенно в C++). Вместо того, чтобы писать sizeof(my_long_type<weird, stuff>) Вы просто делаете sizeof t.

6
ответ дан Johannes Schaub - litb 29 November 2019 в 06:35
поделиться

Линии f и ff определенно хуже, чем g и gg. sizeof f это размер указателя, так как f это точка. Чтобы сделать их эквивалентными, вам нужно написать sizeof *f (или, для лучшей разборчивости, sizeof(*f)).

3
ответ дан Martin v. Löwis 29 November 2019 в 06:35
поделиться

Я склонен использовать sizeof(type) в выделении памяти, но неизменно sizeof(variable) при использовании локальной или глобальной переменной. Тем не менее, существует мудрость в совете использовать имя переменной все время.

у меня также было долгое обсуждение (скорее анимируемый время от времени, и оно продлилось в течение дней - мы закончили договоренность разойтись в проблеме) о том, нормально ли использовать sizeof(variable) или должно ли это быть sizeof variable; то есть, делает имеет значение, включают ли круглые скобки аргумент sizeof. Я никогда не встречался с компилятором, который болтает [приблизительно 115], таким образом, я выбираю однородность и всегда использую круглые скобки с sizeof. Мой коллега был одинаково непреклонен, что круглые скобки не должны использоваться с переменными; это так или иначе существует ценное различие между нотацией с и без круглых скобок. Я не был убежден - я не ожидаю быть убежденным.

На совершенно различном гвозде, несколько других точек [приблизительно 117]:

  • при использовании C99 и VLA - массивы переменной длины - тогда sizeof(vla) не являются постоянным временем компиляции. Остерегайтесь!
  • препроцессор C не понимает sizeof, который является неприятностью, но логичный.
2
ответ дан Jonathan Leffler 29 November 2019 в 06:35
поделиться

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

0
ответ дан SoapBox 29 November 2019 в 06:35
поделиться

Вы можете видеть небольшую разницу между ними:

foo **ff = malloc(count * sizeof *ff);
foo **gg = malloc(sizeof(foo*) * count);

... но что, если распределение не находится рядом с декларацией? Если я наткнусь на линию типа:

ff = realloc(ff, count * sizeof *ff);

- тогда я вполне уверен, что она правильная, даже не помня типа ff. Однако, если я вижу это:

ff = realloc(ff, count * sizeof(foo *));

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

.
4
ответ дан 29 November 2019 в 06:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: