Может ли указатель быть инициализирован случайным адресом, равным 0?
Например, у нас есть
int* p;
Может ли этот указатель инициализироваться случайным образом 0, это означает, что инициализируется операционной системой, в этом случае мы не меняем значение этого указателя?
3 ответа
Вот сложная часть: ни одна действительная программа не может понять это. чтение p
является неопределенным поведением, и может произойти все что угодно, включая возвращение nullptr
даже если p
на самом деле не содержит nullptr
(!)
Если вам интересно, как это возможно, p
может быть внесен в реестр при первой записи. Пытаюсь читать p
до этого дал бы довольно случайные результаты.
Предположение: вы говорите о том, что возвращение malloc или new в какой-то момент должно быть равно 0.
В этом случае я считаю, что ответ - нет. Указатель займет виртуальный адрес. Будучи чем-то динамически распределенным, он получит адрес, принадлежащий куче, который никогда не будет начинаться с адреса 0.
Пространство виртуальной памяти вашего процесса разделено на несколько разделов: текст, данные, BSS, куча (куда идут все динамически размещенные объекты), стек и пространство ядра. Изображение ниже для 32-битной ОС, но для 64-битной аналогично.
Вы можете сделать небольшую программу и прочитать несколько адресов в разных местах, и понять, что вы можете, а что нет.
Куча (место, куда будет указывать ваш указатель), растет после сегментов Text, Data и BSS. Так что никогда не будет 0.
Объявление переменной как глобальной или статической будет автоматически инициализировано в 0X0 операционной системой.