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

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

Das obige Programm zuzugreifen Versuch abstürzen, wenn ich es kompilieren und ausführen Visual Studio 2010 mit und ich weiß, es stürzt ab, weil ich den Zeiger auf 0ein NULL-Zeiger

Was gesetzt würde ich wissen, ist Zugriff auf null pointer in C++ definiert im Standard oder ist es undefined und ich zufällig gerade, dass mein Programm wegen meines Compilers/Computers/Betriebssystems abgestürzt ist

Wenn es definiert ist, was C++ garantiert mir, wenn ich es versuche und auf einen Nullzeiger zugreifen?

+3

Es ist nicht definiert. –

+1

@ R.MartinhoFernandes Also kann ich erwarten, dass auf einigen Computern wird dies nicht zum Absturz bringen? – Caesar

+1

ja, aber Sie können auch erwarten, dass es Ihre Festplatte auf andere formatiert – Laurijssen

Antwort

8

Durch die Dereferenzierung eines Nullzeigers wird undefiniertes Verhalten aufgerufen. Es kann dazu führen, dass verschiedene Dinge auf verschiedenen Compilern, noch mehr - verschiedene Dinge können auf dem gleichen Compiler passieren, wenn sie mehrfach kompiliert werden. Es gibt keine Garantien für das Verhalten überhaupt.

2

Was Ihren Prozess hier zum Absturz bringt, ist, dass das Betriebssystem Ihr Programm daran hindert, mit Speicher zu arbeiten, auf den es keinen Zugriff hat (unter Adresse 0). Windows wird Ihnen eine "Zugriffsverletzung" geben, Linux/Unix wird Ihnen einen "Segmentierungsfehler" geben.

Auch finden Why are NULL pointers defined differently in C and C++? für ein Angebot von dem, was ein Nullzeiger ist in dem Standard

2

Es ist nicht in C++ definiert, damit es nicht auf einigen Betriebssystemen zum Absturz bringen kann, aber man auf einem Absturz unter Strom zählen kann (und frühere) Versionen von Windows und Linux, weil keiner von beiden Ihnen (als Benutzerprozess) Zugriff auf diesen Speicherort gewährt.

Wenn Sie unter Windows einen Programmabbruch verursachen möchten, versuchen Sie es mit DebugBreak(); was eine Ausnahme verursacht (MSDN sagt: Bewirkt, dass im aktuellen Prozess eine Haltepunktausnahme auftritt. Dadurch kann der aufrufende Thread dem Debugger signalisieren, die Ausnahme zu behandeln.)

Verwandte Themen