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

Учитывая следующую строку:

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

Почему используется sizeof (char)? Это не обязательно, правда? Или это просто вопрос стиля?

Какие преимущества у него есть?


person Nyan    schedule 25.06.2010    source источник
comment
Дубликат stackoverflow.com/questions/1011806/, хотя я не согласен с принятым там ответом (я предпочитаю опустить sizeof (char))   -  person user85509    schedule 25.06.2010


Ответы (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 ) );

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

person brainjam    schedule 25.06.2010
comment
Тогда почему бы не использовать type * p = malloc (sizeof (* type) * (len + 1)); ;) - person Nyan; 25.06.2010
comment
@Nyan: Конечно, это тоже работает. Я никогда раньше не видел этого, но если бы я все еще был работающим программистом на C, я бы подумал о том, чтобы принять ваше предложение как идиому ... хотя часть len +1 была бы только для строковых объектов. - person brainjam; 25.06.2010
comment
Мало того, что вы ожидаете, что это будет 1, так оно и определено. Один из очень немногих предметов, размер которых явно задан. - person JaredPar; 25.06.2010

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

person Amardeep AC9MF    schedule 25.06.2010

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

person Michael Mrozek    schedule 25.06.2010