Выделение массива char с помощью malloc - PullRequest
14 голосов
/ 25 июня 2010

Привет, недавно я видел много кода в Интернете (также на SO;), например:

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

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

Ответы [ 3 ]

18 голосов
/ 25 июня 2010

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

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

2 голосов
/ 25 июня 2010

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

1 голос
/ 25 июня 2010

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

...