Können Sie einen NULL-Zeiger dereferenzieren, um eine Referenz zu erhalten?
Der C-Standard definiert die Dereferenzierung eines NULL-Zeigers als undefiniertes Verhalten. Allerdings werfen Codeausschnitte, die eine NULL-Zeiger-Dereferenzierung zum Erhalten einer Referenz beinhalten, wie die folgenden, Fragen auf:
int* ptr = NULL; int& ref = *ptr; int* ptr2 = &ref;
Standarddefinition:
Gemäß dem C-Standard (8.3.2/4 „Referenzen“) kann in einem wohldefinierten Programm keine Nullreferenz existieren. Dies liegt daran, dass die Erstellung einer solchen Referenz eine Bindung an das „Objekt“ erfordern würde, das durch Dereferenzierung eines Nullzeigers erhalten wird, was undefiniertes Verhalten darstellt.
Implementierungsdetail oder wohldefiniert?
In der Praxis führte das bereitgestellte Code-Snippet dazu, dass ptr2 auf NULL gesetzt wurde. Dabei handelt es sich jedoch lediglich um ein Implementierungsdetail. Der Standard besagt ausdrücklich, dass die Dereferenzierung eines Nullzeigers undefiniert ist.
Auswirkungen der Dereferenzierung eines NULL-Zeigers:
Im Allgemeinen führt die Dereferenzierung eines Nullzeigers zu einem Absturz. Im speziellen Fall der Verwendung zum Abrufen einer Referenz implementiert der Compiler die Referenz als Zeiger, wodurch der eigentliche Dereferenzierungsvorgang entfällt. Dennoch bleibt das zugrunde liegende undefinierte Verhalten bestehen.
Ausnahme: Der sizeof-Operator
Die Ausnahme für die Dereferenzierung eines Nullzeigers auf wohldefinierte Weise ist der sizeof-Operator. Bei Verwendung von sizeof wird der Operand nicht ausgewertet, wodurch die Dereferenzierungsoperation vermieden wird.
Das obige ist der detaillierte Inhalt vonKann die Dereferenzierung eines NULL-Zeigers zum Abrufen einer Referenz in C wohldefiniert sein?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!