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