Должен ли я явно указывать возвращаемое значение malloc ()?

Я хотел спросить о следующем случае:

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* , поэтому трансляция будет выполняться автоматически. В C ++ только преобразование в void* будет выполняться неявно, для другого направления требуется явное приведение.

В C ++ вы должны явно использовать, но на самом деле это просто язык, говорящий вам об этом.
В c нет никакой необходимости бросать, память – это просто память – мне нужно будет выполнить поиск, чтобы узнать, требует ли его последний стандарт C.

Давайте будем гением компьютера.