2013-06-12 2 views
7
#include <iostream> 

int main() 
{ 
    int* i = 0; 
    int x = (*i); 
    std::cout << x; 
} 

выше программа будет сбой, когда я скомпилировать и запустить его с помощью Visual Studio 2010 и я знаю, что он выходит из строя, потому что я установить указатель на 0.Попытки доступа к пустому указателю

То, что я хотел бы знать, является доступ к null pointer в C++, определенный в стандарте, или он не определен, и мне просто повезло, что моя программа потерпела крах из-за моего компилятора/компьютера/операционной системы.

Если определено, что C++ гарантирует мне, когда я пытаюсь и получить доступ к нулевому указателю?

+3

Не определено. –

+1

@ R.MartinhoFernandes Итак, я могу ожидать, что на некоторых компьютерах это не сработает? – Caesar

+1

да, но вы также можете ожидать, что он отформатирует ваш жесткий диск на других – Laurijssen

ответ

8

Вывод нулевых указателей вызывает неопределенное поведение. Это может привести к разным вещам на разных компиляторах, тем более - разные вещи могут произойти в одном компиляторе, если они скомпилированы несколько раз. Никаких гарантий поведения вообще нет.

2

Что делает ваш процесс сбоем здесь, OS останавливает вашу программу от возиться с памятью, к которой у него нет доступа (по адресу 0). Windows даст вам «нарушение доступа», Linux/Unix даст вам «ошибку сегментации».

Также см Why are NULL pointers defined differently in C and C++? для цитаты о том, что пустой указатель в стандарте

2

Это не определено в C++, так что не может произойти сбой в некоторых операционных системах, но вы можете рассчитывать на аварии под током (и предыдущие) версии Windows и Linux, потому что ни один из них не позволит вам (как пользовательскому процессу) доступа к этой ячейке памяти.

Также, под Windows, если вы хотите вызвать прерывание программы, попробуйте DebugBreak(); который вызывает исключение (MSDN говорит: вызывает исключение точки останова в текущем процессе. Это позволяет вызывающему потоку сигнализировать отладчику об обработке исключения.)

Смежные вопросы