@DjTolib

Где хранится nullptr? Для разных программ она разная?

Где хранится nullptr? Для разных программ она разная? Вопрос из собеса)
  • Вопрос задан
  • 319 просмотров
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
Что значит «хранится»?
• Значение nullptr хранится в переменной-указателе — как и любое &someObject.
• Объекта правильной «объектной» формы (если, конечно, у объекта присутствует какой-то инвариант или хотя бы таблица виртуальных методов) по адресу *nullptr нет; в большинстве ОС разыменование nullptr приводит к нарушению сегментации и мгновенному вылету (но не обязательно — например, DOS).
• Во всех известных мне ABI (x86/DOS, x86 и x64/Windows, x86 и x64/Linux) nullptr равен нулевому адресу. Это обосновано — по этому адресу обычно располагается таблица прерываний, точка входа, префиксный сегмент или прочая системная хрѣнь, сюда точно соваться не стоит. Но теоретически не обязательно. Этот адрес, естественно, общий для ABI, чтобы можно было объединять в одну программу результаты компиляции разными языками.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
zagayevskiy
@zagayevskiy
Android developer at Yandex
nullptr это просто ключевое слово, обозначающее пустой указатель. Поскольку он пустой, то он нигде не хранится.
Разный ли он в разных программах... А 0 разный в разных программах?
Ответ написан
longclaps
@longclaps
Сходи сюда.
Вбей что-то вроде
int* f()
{
  return nullptr;
}

Посмотри выхлоп на ассемблере.
Поиграйся с компиляторами.
Профит.
Ответ написан
samodum
@samodum
Какой вопрос - такой и ответ
...ptr - - это указатель. Указатель на что? Если бы ты читал книжки, то знал бы, что на адрес.
Поэтому nullptr разный
Ответ написан
Комментировать
@res2001
Developer, ex-admin
nullptr - сам по себе это константа (сейчас не важно ее реальное значение). Где хранится, например, 2 или 100500?
Вот когда вы сделаете присваивание:
void *ptr = nullptr;
То в указателе ptr будет хранится значение nullptr.
Если посмотрите асемблерный код подобного присваивания, то там будет что-то вроде:
mov ax, 0;
В данном примере считаю, что значение nullptr - это 0. Тут видно, что nullptr хранится прямо в коде и является одним из операндов ассемблерной команды mov.
Про то что хранится в памяти, куда указывает nullptr (и ptr из примера), написал Mercury13
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы