Должен ли я явно указывать возвращаемое значение 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*?

Ответы

Ответ 1

Указатель void в C может быть назначен любому указателю без явного приведения.

Ответ 2

Если вам нравится образ "не повторяй себя", вам должно быть интересно, что вам не нужно повторять имя типа из объявления переменной в вызове malloc(). Поскольку, как указывали люди, вы не указали: конвертеры конвертируются в и из void * без потерь, за исключением указателей на функции.

Кроме того, на этой ноте вам не нужно повторять себя с использованием sizeof. Второй пример при распределении структуры можно записать следующим образом:

struct node *temp;
temp = malloc(sizeof *temp);

Что в моем не очень скромном мнении - лучший способ.

Избегая повторения себя, вы сокращаете количество написанных вами вещей, что, в свою очередь, снижает риск того, что любая из этих ошибок будет неправильной.

Обратите внимание на звездочку в аргументе sizeof, это означает "размер объекта, на который указывает этот указатель", который, конечно, совпадает с размером "struct node", но без повторения типа имя. Это связано с тем, что sizeof вычисляет (во время компиляции!) Размер выражения, являющегося его аргументом. Для этого случая. Точно так же, как sizeof 3 вычисляет размер выражения типа int, sizeof *temp вычисляет размер экземпляра struct node.

Конечно, вы повторяете что-то, то есть имя самой переменной, но это часто более простое выражение и легче получить право, а также может быть проще для компилятора обнаружить ошибку.

Ответ 3

C неявно отбрасывает от и до void*, поэтому трансляция будет выполняться автоматически. В С++ только преобразование в void* будет выполняться неявно, для другого направления требуется явное литье.

Ответ 4

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