Привет недавно я видел много кода онлайн (также на ТАК;) как:
char *p = malloc( sizeof(char) * ( len + 1 ) );
Почему sizeof (символ)? Это не необходимо, не так ли? Или это - просто вопрос стиля? Какие преимущества это имеет?
Да, это вопрос стиля, потому что вы ожидаете, что sizeof(char)
всегда будет равен единице.
С другой стороны, использование sizeof(foo)
при выполнении malloc
- это идиома, и, что самое важное, это делает код самодокументируемым.
Также это лучше для сопровождения, возможно. Если бы вы переходили от char
к wchar
, вы бы перешли на
wchar *p = malloc( sizeof(wchar) * ( len + 1 ) );
без особых раздумий. Тогда как преобразование оператора char *p = malloc( len + 1 );
потребует больше размышлений. Все дело в снижении умственных накладных расходов.
И как предлагает @Nyan в комментарии, можно также сделать
type *p = malloc( sizeof(*p) * ( len + 1 ) );
для нуль-терминированных строк и
type *p = malloc( sizeof(*p) * len ) );
для обычных буферов.
Он служит для самодокументирования операции. Язык определяет символ как ровно один байт. Он не указывает, сколько бит находится в этом байте, поскольку некоторые машины имеют 8, 12, 16, 19 или 30 бит минимально адресуемых единиц (или больше). Но char - это всегда один байт.
Согласно спецификации, символы должны быть 1-байтовыми, поэтому это строго необязательно. Я лично всегда включаю sizeof
для согласованности, но это не имеет значения