Beste Antwort
Wenn Sie eine Adresse von etwas drucken müssen oder der Inhalt einer Zeigervariable ist die einzige wirklich tragbare Möglichkeit, dies zu tun, die Verwendung des Formatbezeichners\% p. Der C-Standard besagt, dass die gedruckten Zeichen implementierungsdefiniert sind. In der Praxis generieren die meisten C-Bibliotheksimplementierungen jedoch eine Folge von hexadezimalen Ziffern, die die Adresse darstellen.
Die Formatbezeichner\% u und\% x erwarten eine Ganzzahl ohne Vorzeichen und drucken Sie den Wert in Dezimal- bzw. Hexadezimalzahl. Sie erwarten keine Adresse .
Wenn Sie\% u oder\% x (oder etwas anderes als\% p) verwenden, um dies zu versuchen Wenn Sie eine Adresse drucken, scheint in einigen Umgebungen zu funktionieren , ist jedoch tatsächlich undefiniertes Verhalten und nicht portierbar . Sie können nicht davon ausgehen, dass die Größe eines Zeigers der Größe einer vorzeichenlosen Ganzzahl (oder eines anderen ganzzahligen Datentyps) entspricht. In vielen 64-Bit-Umgebungen beträgt eine vorzeichenlose Ganzzahl beispielsweise 32 Bit. Wenn die Anzahl der Bits in einem Zeiger nicht mit der Anzahl der Bits in einer vorzeichenlosen Ganzzahl in Ihrer Umgebung übereinstimmt und Sie versuchen,\% u oder\% x zum Drucken einer Adresse zu verwenden, erhalten Sie eine falsche Ausgabe und die Ausgabe der nachfolgenden Elemente im selben Aufruf von printf sind möglicherweise auch falsch.
Wenn Sie also eine Adresse drucken möchten, verwenden Sie immer den Formatbezeichner\% p für portablen Code, der undefiniertes Verhalten vermeidet. Nehmen Sie niemals an, dass die Größe eines Zeigers mit der Größe eines anderen C-Datentyps übereinstimmt.
Antwort
Nur die \%p
Die Konvertierung versteht einen Zeiger richtig. Die Konvertierung \%p
druckt einen Zeiger auf implementierungsspezifische Weise.
Die \%u
und \%x
-Konvertierungen gelten für unsigned int
oder int
-Typen, die möglicherweise dieselbe Größe wie ein Zeigertyp haben oder nicht. Die Konvertierung \%u
gibt eine vorzeichenlose Dezimalzahl aus, während \%x
eine vorzeichenlose hexadezimale Ganzzahl in Kleinbuchstaben ausgibt.
To Drucken Sie einen Zeiger entweder mit \%u
oder \%x
. Sie müssen den Zeiger auf eine int
oder unsigned int
. Diese Besetzung kann Informationen verlieren, wenn sizeof(void *) > sizeof(int)
.
Siehe auch: printf, fprintf, sprintf, snprintf, printf\_s , fprintf\_s