Die akzeptierte Antwort erzählt nicht die ganze Geschichte.
Ja, wenn Sie Nullen sehen, ist ein NULL
Zeiger beteiligt. Das liegt daran, NULL
ist per Definition Null. Also kann NULL
nicht viel sagen.
Was interessant über die Nachricht, die Sie erhalten, ist die Tatsache, dass NULL
zweimal erwähnt wird. Tatsächlich ähnelt die von Ihnen gemeldete Nachricht ein wenig der Nachricht, die Windows-Betriebssysteme dem Benutzer zeigen.
Die Nachricht sagt der AdresseNULL
-versucht lesenNULL
. Was bedeutet das? Wie liest sich eine Adresse konkret?
Wir denken typischerweise an die Anweisungen an einer Adresse lesen und schreiben aus dem Speicher an bestimmten Adressen. Wenn wir das wissen, können wir die Fehlermeldung analysieren. Die Nachricht versucht zu artikulieren, dass die Anweisung bei AdresseNULL
versucht, lesenNULL
.
Natürlich gibt es keine Anweisung bei Adresse NULL
, deshalb denken wir an NULL
als speziell in unserem Code. Aber jede Instruktion kann so verstanden werden, als würde sie mit dem Versuch beginnen, sich selbst zu lesen. Wenn das CPU-Register EIP
auf der Adresse NULL
ist, versucht die CPU, den Opcode für eine Anweisung von Adresse 0x00000000 (NULL
) zu lesen. Dieser Versuch, NULL
zu lesen, schlägt fehl und generiert die Nachricht, die Sie erhalten haben.
Beachten Sie im Debugger, dass EIP
gleich 0x00000000 ist, wenn Sie diese Nachricht erhalten. Dies bestätigt die Beschreibung, die ich Ihnen gegeben habe.
Die Frage wird dann, "warum versucht mein Programm, die NULL
Adresse auszuführen."Es gibt drei Möglichkeiten, die in den Sinn.
- Sie versucht haben, einen Funktionsaufruf über einen Funktionszeiger zu machen, die Sie deklariert haben, zugewiesen
NULL
, sonst nie initialisiert und werden dereferencing
- Ähnlich Sie können eine "abstrakte" C++ - Methode aufrufen, die einen
NULL
-Eintrag in der Vtable des Objekts hat. Diese werden in Ihrem Code mit der Syntax erstellt.
- In Ihrem Code wurde ein Stapelpuffer beim Schreiben von Nullen übergelaufen wurden über das Ende des Stapelpuffers geschrieben, über die beibehaltene Rücksprungadresse, wenn die Funktion später ihren 012 ausführtwird der Wert 0x00000000 (
NULL
) aus dem überschriebenen Speicherbereich geladen. Diese Art von Fehler, Stack-Overflow, ist der Namensgeber unseres Forums.
Da Sie erwähnen, dass Sie ein Drittanbieter-Bibliothek aufrufen, werde ich darauf hinweisen, dass es sich um eine Situation der Bibliothek sein kann, erwarten Sie einige API eine nicht NULL
Funktionszeiger als Eingabe zur Verfügung zu stellen. Diese werden manchmal als "Rückruf" -Funktionen bezeichnet.
Sie müssen den Debugger verwenden, um die Ursache Ihres Problems weiter einzuschränken, aber die oben genannten Möglichkeiten sollten Ihnen helfen, das Rätsel zu lösen.
Das hat mich von unter Turbo C erinnert, „Null-Zeiger-Zuordnung“, wenn es in der falschen Art und Weise verwaltet ... – t0mm13b
Ist es reproduzierbar? Ist dies nicht der Fall, fügen Sie ein Tool wie madExcept hinzu und warten Sie auf Fehlerberichte. Verwenden Sie andernfalls den Debugger und schauen Sie sich den Stack-Trace an. –
Dies ist von den alten Turbo C Tage, unter dem Debugger, Hinzufügen einer Uhr zu der Zeiger-Variable auf den Ort 0, die gerade ausgeführte Zeile beim Einstieg, die die Zeigervariable zeigte auf Position 0 Änderungswert ist die Zeile, die verursacht durcheinander. Meistens ein Zeigerfehler ... – t0mm13b