2

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

int* p; 

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

+3

Это может быть. Но как это повлияет на ваш код каким-либо образом? – immibis

+0

Извините, но я слышал, что адресное пространство, содержащее 0, зарезервировано для обработки исключительных ситуаций, проверка недействительных указателей, причем это место памяти может использоваться только ядром os. Правильно ли это? –

+2

И Windows, и Linux никогда не сделают адрес 0 действительным адресом, не знают о Mac OS. Но как это повлияет на ваш код каким-либо образом? – immibis

ответ

-1

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

+0

Я не «верю тебе». Можете ли вы указать на исходный код в библиотеке времени выполнения, который это делает?Или, по крайней мере, указать спецификационную документацию, которая утверждает, что это гарантируется всеми реализациями 'C++ 'и всеми ОС? – xmojmr

+1

@xmojmr: Этот «технический документ» будет стандартом ISO C++ (ISO 14882-2014). Он не может гарантировать, что делает ОС, но типичная ОС вообще не имеет понятия «глобальные переменные». Требование относится к реализации на C++. – MSalters

+2

@xmojmr Раздел 3.6.2 стандарта C++. – molbdnilo

2

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

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

0

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

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

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

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

enter image description here

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