Если вам нравится образ «не повторяйте себя», вам должно быть интересно, что вам не нужно повторять имя типа из объявления переменной в вызове malloc()
. Потому что, как указывали люди, вы не указали: конвертеры конвертируются в и от void *
без потерь, за исключением указателей на функции.
Также на этой ноте вам не нужно повторять себя с использованием sizeof
. Ваш второй пример, при выделении структуры, можно записать так:
struct node *temp;
temp = malloc(sizeof *temp);
Что в моей не столь скромному мнению, является лучшим способом.
Избегание повторения себя сокращает количество вещей, которые вы пишете, что, в свою очередь, снижает риск того, что любая из этих вещей окажется неправильной.
Обратите внимание на звездочку в аргументе sizeof
, это означает «размер объекта, на который указывает этот указатель», который, конечно, совпадает с размером «struct node
», но без повторения имени типа. Это связано с тем, что sizeof
вычисляет (во время компиляции!) Размер выражения, являющегося его аргументом. Для этого случая. Точно так же, как sizeof 3
вычисляет размер выражения типа int
, sizeof *temp
вычисляет размер экземпляра struct node
.
Несомненно, вы повторяете что-то, то есть имя самой переменной, но это часто более простое выражение и легче получить право, а также может быть проще для компилятора обнаружить ошибку.
Если вам, возможно, понадобится скомпилировать код с компилятором C++, а не компилятором C, то требуется бросок. Следовательно, большая часть моего кода включает явное приведение - даже если чистый C не требует этого. Обычно я указываю его/* = C++ = * /, чтобы указать, почему. –
Хотя это не обязательно, мне помогает прочитать код позже с небольшим количеством подробностей. – Xolve
См. Также [этот вопрос] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc/605858#605858). – unwind