Может ли указатель быть инициализирован случайным адресом, равным 0?

Например, у нас есть

int* p;

Может ли этот указатель инициализироваться случайным образом 0, это означает, что инициализируется операционной системой, в этом случае мы не меняем значение этого указателя?

3 ответа

Вот сложная часть: ни одна действительная программа не может понять это. чтение p является неопределенным поведением, и может произойти все что угодно, включая возвращение nullptr даже если p на самом деле не содержит nullptr (!)

Если вам интересно, как это возможно, p может быть внесен в реестр при первой записи. Пытаюсь читать p до этого дал бы довольно случайные результаты.

Предположение: вы говорите о том, что возвращение malloc или new в какой-то момент должно быть равно 0.

В этом случае я считаю, что ответ - нет. Указатель займет виртуальный адрес. Будучи чем-то динамически распределенным, он получит адрес, принадлежащий куче, который никогда не будет начинаться с адреса 0.

Пространство виртуальной памяти вашего процесса разделено на несколько разделов: текст, данные, BSS, куча (куда идут все динамически размещенные объекты), стек и пространство ядра. Изображение ниже для 32-битной ОС, но для 64-битной аналогично.

Вы можете сделать небольшую программу и прочитать несколько адресов в разных местах, и понять, что вы можете, а что нет.

Куча (место, куда будет указывать ваш указатель), растет после сегментов Text, Data и BSS. Так что никогда не будет 0.

Объявление переменной как глобальной или статической будет автоматически инициализировано в 0X0 операционной системой.

Другие вопросы по тегам