Skip to content

Instantly share code, notes, and snippets.

@zamabuvaraeu
Created May 15, 2024 07:42
Show Gist options
  • Save zamabuvaraeu/4a9b35c9c9af5a231fd10aacd77304d8 to your computer and use it in GitHub Desktop.
Save zamabuvaraeu/4a9b35c9c9af5a231fd10aacd77304d8 to your computer and use it in GitHub Desktop.

Постоянно наталкиваюсь на путаницу между нулевым указателем и нулевым адресом. А ведь это разные вещи. И нулевой указатель может не указывать на нулевой адрес.

Нулевой указатель — собый указатель, гарантированно не ссылающийся на объект или функцию.

Нулевой адрес — просто адрес со значением ноль.

Присваивание нуля (и сравнение с нулём) — на самом деле это не присваивание, это специальная инструкция компилятору, которая заставляет считать указатели нулевыми указателями.

Dim p As Integer Ptr = 0

Такая операция превращает p в специальный указатель (нулевой). В популярных архитектурах нулевой указатель указывает на нулевой адрес, но это чистое совпадение, и нельзя закладываться на это поведение.

Чтобы гарантированно получить нулевой адрес, например, можно обнулить указатель через memset:

memset(@p, 0, sizeof(p))

Теперь p указывает на нулевой адрес, но это не делает p нулевым указателем.

А в чём же отличие нулевого указателя, от нулевого адреса?

Разыменование нулевого указателя — неопределённое поведение. Разыменование нулевого адреса — законная операция.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment