Указатель, указывающий на адрес 0x2, действительно является нулевым указателем
0x2 не является константой нулевого указателя.
Значение равно нулю однако не уточняется. Теоретически это может быть 2. Но в большинстве систем это 0. Выходные данные, которые вы показываете, показывают, что в вашей системе значение null не имеет 2.
(что приводит к ошибке сегментации) ?
Косвенное обращение через нуль - не единственное, что вызывает ошибку segfault.
Как я могу обрабатывать такие случаи, как 0x2, с помощью операторов if? (Я имею в виду, обрабатывать случаи, в которых разыменование может вызвать сбой сегментации.
Вы «обрабатываете» их, никогда не пытаясь выполнить косвенное обращение через недействительные указатели. Нет никакого способа узнать, является ли указатель действительным на основе по его значению (за исключением того, что мы знаем, что значение null недействительно).
Какие адреса, кроме 0x2, разыменование указателя на них вызывает ошибку сегментации и почему?
С точки зрения C ++: доступ к любому объекту за пределами срока его службы приводит к тому, что поведение программы не определено. Если объекта по адресу X нет, то доступ к * X является неопределенным поведением, если не указано иное. Объекты создаются путем определения переменных и с использованием new
-выражений.
С точки зрения ОС, эти вещи вызывают ошибку по умолчанию: все адреса, которые не сопоставлены ни с какой памятью. Все записи в память только для чтения.