Должен ли я явным образом приводить возвращаемое значение 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.

Другие вопросы по тегам