Несколько баллов:
C позволяет неявно преобразовывать указатели void в любой другой тип указателя объекта. C ++ нет.
Приведение результата malloc()
в C приведет к потере полезной диагностики, если вы забудете включить stdlib.h или у вас нет объявления для malloc()
в области видимости. Помните, что если C видит вызов функции без предварительного объявления, он будет считать, что функция возвращает int
. Если у вас нет объявления для malloc()
и вы не используете приведение, вы получите диагностику того, что вы пытаетесь назначить несовместимые типы (int для указателя). Если вы приведете результат, вы отключите диагностику и, возможно, у вас возникнут проблемы во время выполнения, поскольку не гарантируется, что преобразование значения указателя в int и возвращение в указатель снова даст вам полезный результат.
Если вы пишете на C ++, вы должны использовать new
и delete
вместо malloc()
и free()
. Да, да, да, я слышал все причины, по которым люди хотят, чтобы их код компилировался как на C, так и на C ++, но преимущества использования правильного инструмента управления памятью для языка перевешивают стоимость поддержки двух версий IMO.
Примечание: тип void *
был добавлен в стандарт C89; более ранние версии C имели malloc()
return char *
, поэтому в этих версиях приведение было , если вы присваивали результат другому типу указателя. Почти все поддерживают хотя бы стандарт C89, так что вероятность того, что вы столкнетесь с одной из этих более старых реализаций, очень мала.