NULL-Pointer-Funktion
Was ist das Verhalten von aufrufen einer Funktion null-pointer?
void (*pFunc)(void) = NULL;
pFunc();
Warum ist es ratsam zu initialisieren, noch ungenutzte Funktion Zeiger auf NULL?
- Genau wie ein normales Zeiger, ich glaube, Sie würde sich ein segmentation Fault.
- stackoverflow.com/questions/10014284/...
- Diese beiden Zeiger auf die gleiche Frage 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
In C und C++, das heißt
undefined behaviour
, was bedeutet, dass dies kann dazu führen Segmentation fault, nichts oder was auch immer einem solchen Fall wird die Ursache basierend auf Ihre compiler, das Betriebssystem Sie verwenden diesen code auf die Umwelt (etc...) bedeutet.Initialisieren Sie einen Zeiger auf eine Funktion oder einen Zeiger im Allgemeinen auf NULL hilft einigen Entwicklern, um sicherzustellen, dass Ihre Zeiger nicht initialisiert ist und nicht gleich auf einen zufälligen Wert und verhindert so, dass Ihnen der dereferenzieren es durch Zufall.
NULL
Zeiger es sagt nur zwei Dinge: dass keine gültige Objekt-Funktion hat die AdresseNULL
; und Referenzierung / aufrufen einerNULL
Zeiger UB. Nun, eine Umsetzung kann wählen, um zu dokumentieren, dass ein bestimmtes Verhalten, und kann sogar geben Sie den binären Wert einerNULL
Zeiger. Für eine schönere Erklärung finden Sie unter diese andere Frage.p == NULL
Sie sagen könnenp == 0
oder nutzen Sie einfachp
in einem booleschen Kontextif(p) { ... }
.0
kann verwendet werden, alsNULL
Zeiger konstant. Aber das bedeutet nicht, dass der NULL-Zeiger an Adresse 0x0 oder ist es ein all-null-bit-Muster. Die aktuelle Adresse desNULL
Zeiger ist die Umsetzung definiert. Verwirrend, ich weiß, aber das ist es.Was happnes, wenn u versuchen, auf NULL?
Folgendes gilt für die Daten als auch code, und das ist, was
passiert, wenn Sie versuchen zu Lesen, NULL(oder jede Adresse von 0 bis
4096,ich.e atleast ersten Seite des Segmentes). Ursache dafür liegt in
Betriebssystem-und Mikroprozessor-Segmentierung/paging-Architektur
Wenn Sie versuchen, auf NULL( oder 0) Adresse, die in jedem von Daten oder code
Abschnitt, es verursacht einen segmentation fault(das ist eigentlich ein killer
page fault). Erste Seite der Abschnitt wird behandelt, wie aus( oder ungültig
Teil) virtuellen Adressraum. Das ist zielgerichtet, die erste Seite
ist gehalten, die ungültige( oder nicht vorhanden), so dass mindestens eine Adresse, die Zeiger
enthält, dargestellt werden können, als ungültig im Programm bei der Ausführung
Zeit.
Seite Deskriptor von der 1. Seite(enthält eine virtuelle Adresse 0,
NULL), hat den ersten bit "Gegenwart" als 0 (bedeutet seinen ungültige Seite). Nun, wenn
Sie versuchen, Zugriff auf NULL-Zeiger(Adresse 0) wird dazu führen, dass zu erhöhen ein
Seite Fehler, Seite nicht vorhanden, und OS werden versuchen, dies zu behandeln
page fault. Wenn die Seite Fehler-handler sehen, dass der Versuch, den Zugang
1. Seite, die behandelt wird als eine ungültige Teil der virtuellen Adresse
Platz, den es killt den Prozess. Das ist alles über user-space-Prozess. Wenn
Sie versuchen, Zugriff auf NULL-Zeiger in der system-Prozess(kernel-level-code),
es wird scheitern, Ihr Betriebssystem und das system zum Absturz bringen.
Links: http://en.wikipedia.org/wiki/Page_fault#Invalid
http://en.wikipedia.org/wiki/Memory_protection#Paged_virtual_memory
http://pdos.csail.mit.edu/6.828/2005/readings/i386/s05_02.htm
Oben ist ausreichend, bt-wie ich denke, dass u sollten dies Lesen wie auch
http://www.iecc.com/linker/linker04.txt
Warum Funktionszeiger auf NULL initialisiert ist?
Obwohl, wenn Sie versuchen, zu nennen, die mit NULL-seine geben wollte, page/segment fault. NULL bedeutet seinen ungültige Funktion. Wenn es
enthält alle Müll-Adresse, aber Sie in Gültiger virtueller Adressraum
code-Abschnitt, ich denke, dass jeder code an dieser Adresse aufgerufen werden, die
könnte sogar noch mehr Katastrophe(spl im Falle von real-time-Systeme).
Initialisieren funcp = funct_foo_name + 1; jetzt rufen Sie die Funktion mit
Funktion-Zeiger. Funktion-Zeiger auf gültige virtuelle Adresse
Platz von code-Abschnitt. bt-Funktion wird von der falschen Stelle
zu führen. entstehen könnten in die falschen code-Ausführung oder falsch
um.
Ist es ratsam, aus dem gleichen Grund wie initializating "normalen" (Daten,) Zeiger auf
NULL
: weil es potenziell macht einige Fehler leichter auf die Spur. Meinungen, ob dies sinnvoll ist oder nicht, natürlich variieren 🙂