В C нет необходимости приводить void *к любому другому типу указателя, это всегда безопасно продвигается. Однако в C ++ это не так. Например,
int *a = malloc(sizeof(int));
работает в C, но не в C ++. (Примечание: я знаю, что вам не следует использовать mallocв C ++ или в этом отношении new, и вместо этого следует отдавать предпочтение умным указателям и / или STL; об этом спрашивается просто из любопытства) Почему стандарт C ++ не допускает такое неявное приведение, в то время как стандарт C делает?
sizeof(*a)вместо этого.
mallocне может вернуть указатель на выделенный тип. newis C ++ действительно возвращает указатель на выделенный тип, так что правильно написанному коду C ++ никогда не придется приводить void *s.
void, C сделал не . Когда это ключевое слово / идея было добавлено в C, они изменили его в соответствии с потребностями C. Это было вскоре после того, как типы указателей начали проверяться вообще . Посмотрите, можете ли вы найти в Интернете брошюру с описанием K & R C или винтажную копию программного текста на C, такого как C Primer от Waite Group . ANSI C был полон функций, перенесенных или вдохновленных C ++, а K & R C был намного проще. Поэтому более правильно, что C ++ расширил C, как он существовал в то время, а C, который вы знаете, был удален из C ++.
long *a = malloc(sizeof(int));К сожалению, кто-то забыл изменить только один тип!