почему у меня возникает segmentation-fault

int* tmp = new int;
tmp = (int *)0;     
printf("%d", *tmp); // segmentation-fault

я думал что когда обращаешься к значению на которое указывает указатель и происходит segmentation-fault это значит что указатель равен NULL но ведь я инициализировал указатель и он указывает на 0 так почему же происходит segmentation-fault?


Ответы (1 шт):

Автор решения: αλεχολυτ

Имеет место быть проблема базового понимания работы указателей.

В строке tmp = (int *)0; происходит преобразование (в сишном стиле) целочисленного нуля в указатель, по сути, нулевой указатель. Разыменование которого и приводит к проблеме. Чтобы не попадать в такие ловушки, достаточно добавить константности (если указатель действительно не предполагается менять), тогда попытка изменить сам указатель вызовет ошибку компиляции:

int* const tmp = new int;
tmp = (int *)0;  // error: assignment of read-only variable 'tmp'

В принципе, даже при отсутствии второй строки, попытка чтения значения (через разыменованный указатель), которое не было инициализировано (память, выделенная через new), приводит к неопределенному (или ошибочному, начиная с C++26) поведению.

Дополнительно посоветую не мешать в кучу C и C++ код. А ещё лучше вовсе отказаться от работы с сырыми указателями в C++.

→ Ссылка