Должен ли я явно привести возвращаемое значение 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   51   2009-06-05 01:09:01

4 ответа:

указатель 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.