Heim >Backend-Entwicklung >C++ >Ist die Dereferenzierung eines nicht initialisierten Zeigers in C undefiniertes Verhalten?

Ist die Dereferenzierung eines nicht initialisierten Zeigers in C undefiniertes Verhalten?

Susan Sarandon
Susan SarandonOriginal
2024-12-14 14:52:16612Durchsuche

Is Dereferencing an Uninitialized Pointer in C   Undefined Behavior?

Undefiniertes Verhalten: Dereferenzierung nicht initialisierter Zeiger in C

Ein häufiger Punkt der Verwirrung in C ist das Verständnis, wann die Dereferenzierung eines nicht initialisierten Zeigers ein undefiniertes Verhalten (UB) darstellt. Obwohl der C-Standard zahlreiche Regeln enthält, kann es schwierig sein, die genauen Bestimmungen zu finden, die dieses Verhalten definieren.

Der fragliche Codeausschnitt:

int* ptr;
*ptr = 0;

wirft die Frage auf, ob die Dereferenzierung von ptr führt zu UB. Um dies zu verdeutlichen, vertiefen wir uns in die relevanten Abschnitte des C-Standards.

Standardbestimmungen

Abschnitt 4.1 des Standards bietet entscheidende Einblicke. Darin heißt es:

„Wenn das Objekt, auf das sich der L-Wert bezieht, kein Objekt vom Typ T und kein Objekt eines von T abgeleiteten Typs ist oder wenn das Objekt nicht initialisiert ist, erfordert ein Programm dies.“ Die Konvertierung hat ein undefiniertes Verhalten.“

In unserem Fall ist ptr ein nicht initialisierter Zeiger auf eine Ganzzahl. Daher fällt der Versuch, ihn zu dereferenzieren, ohne ihn zuerst zu initialisieren, unter die in Abschnitt 4.1 beschriebene Bedingung und führt zu UB.

Abschnitt 3.7.3.2/4, der oft in Bezug auf UB zitiert wird, gilt nicht direkt für den Code fragliches Snippet, da es sich um die Verwendung von Freigabefunktionen für Nicht-Null-Zeiger handelt.

Zusätzlich Ressourcen

Wenn Sie im Standard nach „uninitial“ suchen, können andere relevante Abschnitte angezeigt werden, z. B. 8.5.1, in dem die Regeln für den Zugriff auf nicht initialisierte Objekte weiter erläutert werden.

Das obige ist der detaillierte Inhalt vonIst die Dereferenzierung eines nicht initialisierten Zeigers in C undefiniertes Verhalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn