Die kurze Antwort
Ja . Das Drucken von Nullzeigern mit dem %p
Konvertierungsspezifizierer hat ein undefiniertes Verhalten. Trotzdem ist mir keine vorhandene konforme Implementierung bekannt, die sich schlecht verhalten würde.
Die Antwort gilt für alle C-Standards (C89 / C99 / C11).
Die lange Antwort
Der %p
Konvertierungsspezifizierer erwartet, dass ein Argument vom Typ Zeiger ungültig wird. Die Konvertierung des Zeigers in druckbare Zeichen ist implementierungsdefiniert. Es wird nicht angegeben, dass ein Nullzeiger erwartet wird.
Die Einführung in die Standardbibliotheksfunktionen besagt, dass Nullzeiger als Argumente für (Standardbibliotheks-) Funktionen als ungültige Werte betrachtet werden, sofern nicht ausdrücklich anders angegeben.
C99
/. C11
§7.1.4 p1
[...] Wenn ein Argument für eine Funktion einen ungültigen Wert hat (z. B. [...] einen Nullzeiger, ist das Verhalten [...] undefiniert.
Beispiele für (Standardbibliotheks-) Funktionen, die Nullzeiger als gültige Argumente erwarten:
fflush()
verwendet einen Nullzeiger zum Löschen "aller zutreffenden Streams".
freopen()
verwendet einen Nullzeiger, um die Datei anzuzeigen, die dem Stream "aktuell zugeordnet" ist.
snprintf()
Ermöglicht die Übergabe eines Nullzeigers, wenn 'n' Null ist.
realloc()
verwendet einen Nullzeiger zum Zuweisen eines neuen Objekts.
free()
ermöglicht die Übergabe eines Nullzeigers.
strtok()
verwendet einen Nullzeiger für nachfolgende Aufrufe.
Wenn wir den Fall für annehmen snprintf()
, ist es sinnvoll, die Übergabe eines Nullzeigers zuzulassen, wenn 'n' Null ist, aber dies ist nicht der Fall für andere (Standardbibliotheks-) Funktionen, die eine ähnliche Null 'n' zulassen. Zum Beispiel: memcpy()
, memmove()
, strncpy()
, memset()
, memcmp()
.
Es wird nicht nur in der Einführung in die Standardbibliothek angegeben, sondern auch noch einmal in der Einführung in diese Funktionen:
C99 §7.21.1 p2
/. C11 §7.24.1 p2
Wenn ein als size_t
n deklariertes Argument die Länge des Arrays für eine Funktion angibt, kann n bei einem Aufruf dieser Funktion den Wert Null haben. Sofern in der Beschreibung einer bestimmten Funktion in diesem Unterabschnitt nicht ausdrücklich anders angegeben, müssen Zeigerargumente für einen solchen Aufruf weiterhin gültige Werte haben, wie in 7.1.4 beschrieben.
Ist es beabsichtigt?
Ich weiß nicht, ob die UB von %p
mit einem Nullzeiger tatsächlich beabsichtigt ist, aber da der Standard explizit angibt, dass Nullzeiger als ungültige Werte als Argumente für Standardbibliotheksfunktionen betrachtet werden, werden die Fälle explizit angegeben, in denen eine Null vorliegt Zeiger ist ein gültiges Argument (snprintf, frei, etc.), und dann geht es und einmal wiederholt erneut die Forderung nach den Argumenten gelten sogar in Null ‚n‘ Fälle ( memcpy
, memmove
, memset
), dann denke ich , es vernünftig anzunehmen , dass die Das C-Normungskomitee ist nicht allzu besorgt darüber, dass solche Dinge nicht definiert sind.