2010-05-04 23 views
11

Eines der Vorstellungsgespräch Fragen zu C-Zeiger here ist das Folgende: Was ist null Zeigerzuweisungsfehler?Was ist "Nullzeiger Zuweisung Fehler"?

Ich habe für eine Weile gegoogelt und sehe keine vernünftige Erklärung. Was ist das? Versucht man über einen Nullzeiger zu schreiben? Etwas Architektur- oder Umfeld-spezifisch? Was genau ist dieser Fehler?

+1

http://www.faqs.org/qa/qa-3786.html – zaf

Antwort

19

http://www.faqs.org/qa/qa-3786.html

Eine NULL-Zeiger Zuordnung ist ein Laufzeitfehler Es aus verschiedenen Gründen erfolgt ist, dass Ihr Programm hat versucht, einen unzulässigen Speicherstelle zuzugreifen. Ungültiger Standort bedeutet, dass sich der Speicherort entweder im Adressbereich des Betriebssystems oder im Speicherbereich des anderen Prozesses befindet. In stdio.h wird NULL als 0 definiert. Wenn Ihr Programm versucht, auf den 0. Speicherort zuzugreifen, beendet das Betriebssystem Ihr Programm mit Laufzeitzuweisungsfehler, da sich der 0. Standort im Adressbereich des Betriebssystems befindet und das Betriebssystem keinen Zugriff zulässt sein Adressraum nach Benutzerprogramm.

Beispielcode:

int* ptr = NULL; 
*ptr = 3; 

Erläuterung:
auf fast jedem System, Adresse 0 ist reserviert. Das System erlaubt Ihnen nicht, an diesen Ort zu schreiben. Wenn Sie es versuchen, erhalten Sie eine Laufzeitausnahme (Zugriffsverletzung, segmentation fault, usw.).

+0

Ich habe das gesehen. Ist das genau? Geht es nur darum, durch einen Nullzeiger zu schreiben? – sharptooth

+0

Ja. Wie der Name des Fehlers suggeriert ("Nullzeigerzuweisungsfehler"), wird er ausgelöst, wenn Sie versuchen, einem Zeiger, der auf NULL initialisiert wurde, einen Wert (keine Adresse) zuzuweisen. (Aber NULL ist nicht notwendigerweise Null (obwohl es fast immer ist), wie von wiki angegeben: http://en.wikipedia.org/wiki/Pointer_(computing)#Null_pointer) – Paya

0

Es gibt viele Szenarien, in denen Sie Probleme sehen können. Aber das Wichtigste ist, dass Sie den Speicher nicht richtig zugeordnet haben. Der folgende Code würde nach dem Ausführen des Programms eine Nullzeigerzuweisungsfehlermeldung erzeugen. Hinweis: Es wird korrekt kompiliert.

void CopyMessage(char *p) 
{ 
    strcpy(p, "welcome"); 
} 

void main() 
{ 
    char *src; 
    CopyMessage(src); 
} 
+0

Dies erzeugt keine solche Nachricht, wenn sie mit gcc kompiliert wird -4.3.4 auf ideone.com – sharptooth

1

I kann tatsächlich nicht die Quelle erinnern, aber nach der Quelle, dieser Laufzeitfehler ist beschränkt auf kleine und mittlere Speichermodelle durch entsprechende Compiler in Betrieb genommen wird. Sie sehen, wie zuvor gesagt, dass der Null-Zeiger tatsächlich nicht auf Null zeigt, tatsächlich verwenden unterschiedliche Compiler unterschiedliche, aber feste Speicherplätze, um als Null-Zeiger verwendet zu werden.

Betrachten wir den Fall von TC-Compiler, dieser Compiler platziert vier Null-Bytes am unteren Rand des Datensegments und TC Copyright-Hinweis. TC verwendet auch die Position DS: 0000, das untere Ende des Datensegments als Nullzeiger. Würde man also diesem Nullzeiger einen Wert zuweisen, würde er in der Tat die vier Bytes ändern und wahrscheinlich die Copyright-Notiz durcheinander bringen.

Nun werden beim Programmabschluss die vier Nullen und das Copyright-Banner auf jede Art von Änderung geprüft. Wenn Änderungen gefunden werden, wird ein Nullzeigerzuordnungsfehler generiert.

Also, ich denke, es ist nicht nur der Nullzeiger, jeder Zeiger, der wild wird, wenn versucht, auf einige Schlüsselbereiche zugreifen, werden Sie mit Nullzeiger Zuordnung Fehler begrüßt.

0

Es ist ein Laufzeitfehler tritt auf, wenn Sie versuchen, ungültigen Speicherplatz anzuzeigen, normalerweise Adresse 0, die für OS reserviert ist.

-2

2017-10-27: umschreiben

Diese Beschreibung ist außerhalb der üblichen Definition eines Null-Pointer-Fehler, aber es kann einen Null-Zeiger dennoch produzieren, obwohl häufigen Fehler produzieren, oder gar keine. Es gibt oft keinen Hinweis auf seine Existenz außer "wenn oder wann" das Programm nicht wie erwartet funktioniert. Dies liefert nicht-konventionelle Beispiele und Definitionen von potentiellen Quellen von Nullzeigerzuweisungsfehlern, anstatt ein herkömmliches Verständnis zu definieren, das eher ein Fehler in der Konvention als ein Fehler in der Programmierlogik ist.

Dieser Fehlertyp (nicht definiert oder null) ist viel seltener. Aber moderne Programmierung, Benchtop-Geräte wie ein Arduino, Raspberry PI, AMD oder andere Computer auf einem Chip-Programmierung gibt es in einer Vielzahl von Formen, von denen viele so einfach wie gestern sind, existiert dieses Problem heute noch und kann sogar auftreten in den anspruchsvollsten Systemen. Darüber hinaus sind Unternehmen, die ihre eigenen Variablen- oder Datenstrukturen aufbauen, wahrscheinlich auch die wahrscheinlichsten Leute, die dies heutzutage sehen. Die Absicht ist, Beispiele zu zeigen, die bei der Anerkennung helfen können.

Damit dies ein "Null" -Zeigerfehler ist, muss der zugewiesene Wert nur '0' oder 'Null' sein. Aber es wurde historisch ein 'Nullzeigerfehler' genannt, der nicht nur ein einfacher Nullzeiger ist; aber wegen ihres Auftretens beim Löschen oder Nullstellen eines Arrays überschreitet oder unterschreitet die Routine die Grenzen des Arrays. Es handelt sich jedoch einfach um einen Fehler, der durch Fehlberechnungen von Arraygrenzen verursacht wird und zu Nullzeigerzuweisungen und anderen Fehlern führen kann. Diese sind oft nicht leicht zu erkennen und erzeugen möglicherweise keinen sofortigen oder gar keinen Fehler, da die Adresse, auf die der Zeiger ursprünglich gezeigt hat, wenn er definiert wurde, einen unerwünschten Wert (eine schlechte Adresse) enthält. Und wann und durch was es überschrieben wurde, kann fast unmöglich zu finden sein. Dies ist Teil der Definition von Fehlertypen, die Nullzeiger erzeugen. Wo der Zeiger mit einer Null oder Null überschrieben wird und es wird einen Fehler erzeugen, und man bleibt mit dem Problem zu finden, was es geändert hat. Es muss besonders darauf geachtet werden, dass die Indizes korrekt berechnet werden, wobei die Option 0 oder 1 berücksichtigt wird. Außerdem wird beim Verschieben von Datenblöcken korrekt berechnet. Glücklicherweise können viele anspruchsvolle Entwicklungssoftware-Anwendungen und High-Level-Sprachen viele dieser Probleme vor oder während der Kompilierung erfassen, wenn der Typ des Variablenarrays explizit umgewandelt wird oder wenn das Programm in einer Laufzeitumgebung geschrieben werden kann und Array-Grenzen überwacht.

Ein Nullzeiger ist, wie in früheren Tagen definiert, jede Variable, die als Zeiger verwendet wird, und den Adressinhalt der Zeigeradresse, dh die Adresse, auf die der Zeiger zeigt, nicht die Position, auf die er zeigt oder null, ODER wurde modifiziert, ohne die Absicht oder das Wissen des Programmierers überschrieben, was ein Nullwert sein könnte, aber auch ein beliebiger anderer Wert sein könnte. Oft erstellt nur der Nullzeiger eine Fehlermeldung, obwohl der Code einen Fehler verursachen kann, da es sich häufig um Datenblöcke handelt, die Nullen enthalten, die an falschen Stellen gespeichert sind. Anstatt auf die ursprünglich definierte Adresse zu zeigen, in der sich die Daten befinden sollten, enthält sie jetzt eine Nulladresse oder eine unbekannte Adresse, die Daten an eine ungültige oder unerwünschte Stelle verschiebt und den Code oder die Daten dort beschädigt. Da der Fehler an den Daten oder der Code nicht sofort ausgeführt oder verwendet werden kann, wenn er in einen vorhandenen unbenutzten Speicherort verschoben wird, wenn der Code oder die Daten zu einem späteren Zeitpunkt des Laufs ein Problem verursachen, kann es keine Informationen geben an der "echten" Stelle des Fehlers, ob es Nullzeiger oder andere Verfälschungen erzeugt oder zuweist, verändert es den Code, und die Dinge können komisch werden, wirklich komisch.

Zusammenfassend ist ein Nullzeiger eine beliebige Nulladresse, die verwendet wird, um auf einen Speicherort zu zeigen, unabhängig davon, was sie erstellt. Ein Nullzeigerzuweisungsfehler oder viele andere Fehler können diesem Problem und diesem Beispiel zugewiesen werden.In einfacheren Architektur- oder Programmierumgebungen kann es sich auf jeden Code beziehen, der unbeabsichtigt Nullen als Zeiger erzeugt oder einen Fehler erzeugt, der die Ausführung in jedem Fall stoppt, wie das Überschreiben eines Bytes im Rückgabe-Stack, das Überschreiben von Code und das Setzen Code oder Daten am falschen Ort, nicht nur als Adresse. So, während die obigen Beispiele gut funktionieren, um ein Beispiel für einen Nullzeiger zu definieren. Also erweitern wir das Konzept, Ein Null-Zeiger ist ein beliebiger Zeiger, der als Variablenzeiger verwendet wird, und der Adressenort dieser Variablen aus einem von mehreren Gründen enthält jetzt einen "Null" oder irgendeinen unbeabsichtigten Wert, der auf einen unerwünschten Speicherort zeigt egal wie es dort hinkam.

So schließlich kann man einen Null-Zeiger-Fehler erhalten, und beim Untersuchen des Zeigers findet es eine Null enthält; aber, kann nicht den Code finden, der die Null in den Zeiger platziert oder zugewiesen hat. Dies ist eine breite Definition des Nullzeigerzuweisungsfehlers und ist das Worst-Case-Szenario eines Nullzeigerfehlers. Wenn das in einem großen Programm auftritt, kann das der Tod des Programms sein, da der Fehler unbemerkt bleibt, bis das Programm erweitert wird, wenn der Fehler zuvor existierte und wenn an den falschen Speicherort geschrieben wurde und jetzt kann der falsche Speicherort innerhalb des neuen Codes vorhanden sein und zufällige Fehler generieren. Zum Beispiel: Der schlechte Adressenwert bewirkt, dass Daten außerhalb des definierten Variablenraums geschrieben werden, bleibt aber für einige Zeit unbemerkt, weil er geschrieben wird und gelesen wird und alles "erscheint" OK! Aber das Programm erweitert sich, wird größer, neuer Code existiert im selben Adressraum wie der Speicher, in dem der ursprüngliche alte Fehler existierte, der Daten in den falschen Adressraum schreibt und niemand bemerkt, ob ein Byte oder ein ganzer Datenblock! Aber jetzt gibt es dort einen neuen Code. Und es wird durch den alten, unentdeckten Fehler korrumpiert, und der Fehler, der vor einem Jahr existierte, ist jetzt fast, wenn nicht vollständig, unmöglich zu finden. Die Logik des Administrators diktiert normalerweise, warum es dort aussieht, es lief und funktionierte im letzten Jahr gut. Aber jetzt, nichts funktioniert, große Stücke sind gebrochen, schauen und schauen und nichts finden Sie. Es ist, als ob der Fehler nicht existiert, und doch tut es das. Was verursacht es, wer Code vermutet, der Jahre zuvor geschrieben wurde? Es werden auch Nullzeiger und viele andere Fehler verursacht.

Vielleicht ist diese Antwort fehl am Platz und würde besser dazu dienen, an anderer Stelle aufgeführt zu werden. Moderator? Vielleicht gibt es Bedenken, weil diese "Antwort" nicht relevant ist, da es Bedenken gibt, das Wort "Zuweisung" in der Frage zu verwenden, dh absichtlich zugewiesen. Der Begriff der Zuordnung erfordert jedoch keine Kenntnis oder Zustimmung. Ein Algorithmus oder Code kann Werte zuweisen. Nullzeiger können auf viele Arten erzeugt werden, das Beispiel hier ist wahrscheinlich das üblichste außerhalb herkömmlicher Fehler.

Es scheint, dass diese Information 'a' Platz hat und hier als Antwort enthalten ist. Positive, fruchtbare Rückmeldungen oder Vorschläge werden eher geschätzt als einfache Abstimmungen. Wenn jemand etwas dazu sagen möchte, ist vielleicht eine Meta-Diskussion angebracht?

Prost.

+0

Ich kann sehen, warum dies markiert wurde ... es ist entschieden unklar ... Ich werde es umgehend überarbeiten. – Cyberchipz

+0

Raten Sie, ich war beim zweiten Mal nicht klar ... versuchen Sie es erneut. – Cyberchipz

+0

Wie wäre es mit einem Kommentar .. TLDR? – Cyberchipz