Я пытаюсь понять разницу между C и C ++ относительно пустых указателей. следующие компиляции в C, но не в C ++ (все компиляции выполняются с помощью gcc / g ++ -ansi -pedantic -Wall):
int* p = malloc(sizeof(int));
Потому что malloc
возвращает void*
, который C ++ не позволяет присвоить int*
, в то время как C разрешает это.
Однако, здесь:
void foo(void* vptr)
{
}
int main()
{
int* p = (int*) malloc(sizeof(int));
foo(p);
return 0;
}
И C ++, и C компилируют его без жалоб. Почему?
K & R2 говорят:
Любой указатель на объект может быть
преобразован в тип void *
без потерь
информации. Если результат
преобразован обратно в исходный указатель
тип, оригинальный указатель
выздоровел.
И это довольно суммирует все, что есть о void*
преобразованиях в C. Что диктует стандарт C ++?