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

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

Powyższy program padnie gdy skompilować i uruchomić go za pomocą Visual Studio 2010 i wiem, że wywala bo ustawić wskaźnik do 0.próbuje uzyskać dostęp do pustego wskaźnika

Co chciałbym wiedzieć, jest dostęp do null pointer w języku C++ zdefiniowanym w standardzie lub czy jest on niezdefiniowany i po prostu mam szczęście, że mój program się zawiesił z powodu mojego kompilatora/komputera/systemu operacyjnego

Jeśli jest zdefiniowany, co gwarantuje C++, gdy próbuję i uzyskać dostęp do wskaźnika pustego?

+3

Nieokreślony. –

+1

@ R.MartinhoFernandes Więc mogę się spodziewać, że na niektórych komputerach to się nie zawiesi? – Caesar

+1

Tak, ale możesz także oczekiwać, że formatuje dysk twardy na innych. – Laurijssen

Odpowiedz

8

Wykluczenie zerowego wskaźnika wywoła niezdefiniowane zachowanie. Może to powodować różne rzeczy na różnych kompilatorach, a nawet więcej - różne rzeczy mogą się zdarzyć na tym samym kompilatorze, jeśli są kompilowane wiele razy. W ogóle nie ma gwarancji zachowania.

2

To, co powoduje, że twój proces się zawiesił, to system operacyjny, który zatrzymuje twój program przed manipulowaniem pamięcią, do której nie ma dostępu (pod adresem 0). Windows daje "naruszenie dostępu", Linux/Unix daje "błąd segmentacji".

również zobaczyć Why are NULL pointers defined differently in C and C++? na ofertę, co null pointer jest średnia

2

To nie jest zdefiniowane w C++, więc nie może upaść na niektórych systemach operacyjnych, ale można liczyć na katastrofie pod prąd (i poprzednie) wersje systemu Windows i Linux, ponieważ żadna z nich nie pozwoli (jako procesowi użytkownika) uzyskać dostępu do tej lokalizacji pamięci.

Również w systemie Windows, jeśli chcesz spowodować przerwę programu, wypróbuj DebugBreak(); co powoduje wyjątek (MSDN mówi: powoduje wystąpienie wyjątku punktu przerwania w bieżącym procesie. Pozwala to wątkowi wywołującemu zasygnalizować debuggerowi obsługę wyjątku.)