Выделение массива символов с помощью malloc

Привет недавно я видел много кода онлайн (также на ТАК;) как:

   char *p = malloc( sizeof(char) * ( len + 1 ) );

Почему sizeof (символ)? Это не необходимо, не так ли? Или это - просто вопрос стиля? Какие преимущества это имеет?

15
задан brainjam 17 September 2014 в 15:20
поделиться

3 ответа

Да, это вопрос стиля, потому что вы ожидаете, что 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 ) );

для обычных буферов.

18
ответ дан 1 December 2019 в 03:34
поделиться

Он служит для самодокументирования операции. Язык определяет символ как ровно один байт. Он не указывает, сколько бит находится в этом байте, поскольку некоторые машины имеют 8, 12, 16, 19 или 30 бит минимально адресуемых единиц (или больше). Но char - это всегда один байт.

2
ответ дан 1 December 2019 в 03:34
поделиться

Согласно спецификации, символы должны быть 1-байтовыми, поэтому это строго необязательно. Я лично всегда включаю sizeof для согласованности, но это не имеет значения

1
ответ дан 1 December 2019 в 03:34
поделиться
Другие вопросы по тегам:

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