Это все вопрос стиля кодирования.Существует несколько стилей.
Чтобы действительно ответить на вопрос, люди пишут
malloc(n * sizeof(char))
, чтобы сохранить весь свой код, который использует malloc
, согласованным.В следующий раз им может понадобиться int
, а затем они могут написать код таким же образом,
malloc(n * sizeof(int))
Так что причина, по которой это делается для поддержания согласованности стиля кодирования.Даже если sizeof(char)
действительно гарантированно будет 1 и поэтому является излишним.Это способ написания самодокументируемого кода.
Однако наиболее распространенный способ использования malloc в C, возможно,
type* t = malloc(n * sizeof(*t));
или эквивалент 100%:
type* t = malloc(n * sizeof *t);
Поскольку оператор sizeof
не оценивается для побочных эффектов, этот код безопасен, даже если переменная t
еще не инициализирована.
Третий возможныйстиль - педантически правильный, который будет использовать указатели массива , поскольку мы выделяем на самом деле массивы:
type (*t)[n] = malloc( sizeof(type[n]) );
Это, пожалуй, самый правильный путь, поскольку корректность типовобеспокоен.Размер массива распределяется, и мы указываем на выделенный массив указателем массива.
Однако проблема этого стиля состоит в том, что указатели массива добавляют дополнительную сложность синтаксису: вам придетсяссылаться на этот массив как (*t)[i]
вместо t[i]
.Это делает код сложнее для чтения.(А также в качестве примечания: если n не является целочисленным константным выражением, код не будет компилироваться на старых устаревших компиляторах Си.)