почему у меня возникает 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++.