Учитывая следующую строку:
char *p = malloc( sizeof(char) * ( len + 1 ) );
Почему используется sizeof (char)? Это не обязательно, правда? Или это просто вопрос стиля?
Какие преимущества у него есть?
Учитывая следующую строку:
char *p = malloc( sizeof(char) * ( len + 1 ) );
Почему используется sizeof (char)? Это не обязательно, правда? Или это просто вопрос стиля?
Какие преимущества у него есть?
Да, это вопрос стиля, потому что можно ожидать, что 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 ) );
для обычных буферов.
len +1
была бы только для строковых объектов.
- person brainjam; 25.06.2010
Он служит для самостоятельного документирования операции. Язык определяет символ как ровно один байт. Он не указывает, сколько бит находится в этом байте, поскольку на некоторых машинах минимальные адресуемые единицы 8, 12, 16, 19 или 30 бит (или больше). Но char всегда один байт.
Спецификация требует, чтобы символы были 1-байтовыми, поэтому это строго необязательно. Я лично всегда включаю sizeof
для единообразия, но это не имеет значения