Должен ли я явным образом приводить возвращаемое значение malloc()?
Я хотел спросить о следующем случае:
char *temp;
temp = malloc(10);
С возвращаемым типом malloc
является void*
Будет ли указатель возвращен malloc
быть неявно приведенным к char*
Тип, прежде чем назначить на темп? Что стандарт говорит по этому поводу?
Если наша переменная-указатель имеет некоторый тип структуры, например:
struct node *temp;
temp = (struct node *)malloc(sizeof(struct node));
Если мы выделим память для temp без приведения ее к struct node*
тип, будет ли он неявно приведен к struct node*
введите или необходимо явно привести его к struct node*
тип?
4 ответа
Пустой указатель в C может быть назначен любому указателю без явного приведения.
Если вам нравится мышление "не повторяйте себя", должно быть приятно, что вам не нужно повторять имя типа из объявления переменной в malloc()
вызов. Потому что, как указали люди, вы не делаете: указатели конвертируются в и из void *
без потерь, за исключением указателей на функции.
Кроме того, на этой ноте, вам не нужно повторять себя с использованием sizeof
или. Ваш второй пример при выделении структуры может быть записан так:
struct node *temp;
temp = malloc(sizeof *temp);
Что по моему не столь скромному мнению является лучшим способом.
Избегание повторения сокращает количество написанных вами вещей, что, в свою очередь, снижает риск того, что что-то из этого не так.
Обратите внимание на звездочку в sizeof
аргумент, это означает "размер объекта, на который указывает этот указатель", что, конечно, совпадает с "размером типа" struct node
"но без повторения имени типа. Это потому, что sizeof
вычисляет (во время компиляции!) размер выражения, которое является его аргументом. Для этого случая. Как sizeof 3
вычисляет размер выражения типа int
, sizeof *temp
вычисляет размер экземпляра struct node
,
Конечно, вы повторяете что-то, то есть само имя переменной, но это часто более простое выражение, и его легче понять, а также компилятору легче обнаружить ошибку.
C неявно приводится от и к void*
, так что приведение будет сделано автоматически. В C++ только преобразование в void*
будет сделано неявно, для другого направления требуется явное приведение.
В C++ вы должны явно использовать приведение, но на самом деле это просто язык, говорящий вам за это.
В c нет необходимости в приведении, память - это просто память - мне нужно будет выполнить поиск, чтобы выяснить, требуется ли это для последнего стандарта C.