Wo ist `%p` mit printf nützlich?

Lesezeit: 5 Minuten

Wo ist p mit printf nutzlich
Möb

Schließlich machen diese beiden Aussagen dasselbe …

int a = 10;
int *b = &a;
printf("%pn",b);
printf("%08Xn",b);

Zum Beispiel (mit unterschiedlichen Adressen):

0012FEE0
0012FEE0

Es ist trivial, den Zeiger wie gewünscht mit zu formatieren %xalso gibt es eine gute Verwendung für die %p Möglichkeit?

  • Durch die Verwendung von ‘%p’ geben Sie die Adresse der betreffenden Variablen aus: “Das void * Zeigerargument wird hexadezimal gedruckt (wie von %#x oder %#lx).”

    Benutzer1831086

    3. März 10 um 10:26 Uhr


  • In C++ können Sie (void *) typecast verwenden: siehe stackoverflow.com/questions/5657123/…

    – kagali-san

    14. April 11 um 0:21 Uhr

Wo ist p mit printf nutzlich
Peter Hosey

Sie tun nicht dasselbe. Letzteres printf Aussage interpretiert b als ein unsigned intwas falsch ist, wie b ist ein Zeiger.

Zeiger u unsigned ints sind nicht immer gleich groß, daher sind diese nicht austauschbar. Wenn sie nicht die gleiche Größe haben (ein immer häufigerer Fall, da 64-Bit-CPUs und Betriebssysteme immer häufiger verwendet werden), %x druckt nur die Hälfte der Adresse. Auf einem Mac (und wahrscheinlich einigen anderen Systemen) das Wille die Adresse ruinieren; die Ausgabe wird falsch sein.

Verwenden Sie immer %p für Zeiger.

  • %p wird auch eine angemessene Texturdarstellung für den Zeiger für die Plattform verwenden. Auf Plattformen, auf denen es üblich ist, Zeiger in Hex darzustellen, macht dies keinen Unterschied, solange die Größe korrekt ist, aber für eine segmentierte Architektur (erinnern Sie sich an DOS?) kann es eine Segment:Offset-Darstellung verwenden.

    – Ein Programmierer

    3. März 10 um 8:23 Uhr

  • Man muss auch werfen b zu void * mit dem %p format – dies ist einer der wenigen Fälle in C, wo man eine Umwandlung benötigt.

    – Alok Singhal

    3. März 10 um 11:25 Uhr

  • “Die ganze Welt ist ein VAX!” Syndrom.

    – David Cary

    22. August 2011 um 20:30 Uhr

  • Hinzufügen zum Kommentar von @AlokSinghal: für GCC, wenn Sie mit kompilieren -Wextra flag erhalten Sie entsprechende Warnungen bei falschen Eingaben printf. Um die Warnung verschwinden zu lassen, müssen Sie das richtige Formular verwenden und zu werfen void* was hilfreich sein kann.

    – Fred

    23. Juli 18 um 22:35 Uhr


Zumindest auf einem System, das nicht sehr ungewöhnlich ist, drucken sie nicht dasselbe:

~/src> uname -m
i686
~/src> gcc -v
Using built-in specs.
Target: i686-pc-linux-gnu
[some output snipped]
gcc version 4.1.2 (Gentoo 4.1.2)
~/src> gcc -o printfptr printfptr.c
~/src> ./printfptr
0xbf8ce99c
bf8ce99c

Beachten Sie, wie die Zeigerversion a hinzufügt 0x Präfix, zum Beispiel. Verwenden Sie immer %p, da es die Größe von Zeigern kennt und weiß, wie sie am besten als Text dargestellt werden.

  • “…das ist nicht sehr ungewöhnlich”. Schön 🙂

    – Verrückter Physiker

    25. Juni 18 um 23:37 Uhr

1643915407 653 Wo ist p mit printf nutzlich
Mauritius

Darauf können Sie sich nicht verlassen %p Anzeige eines 0x Präfix. In Visual C++ ist dies nicht der Fall. Benutzen %#p tragbar sein.

  • Ist das irgendwo dokumentiert? Ich kann nichts über # in Verbindung mit %p finden. Ich habe kontrolliert: msdn.microsoft.com/en-us/library/8aky45ct(v=vs.71).aspx cplusplus.com/reference/clibrary/cstdio/printf

    – Suma

    25. September 12 um 10:24 Uhr

  • PC-Lint mag es nicht, aber es funktioniert in Visual Studio. Leider wird ‘0X’ und nicht ‘0x’ vorangestellt, wodurch der tatsächliche Wert schwer lesbar ist. Vermutlich liegt dies an einer fehlenden ‘%P’-Variante. Alles in allem leidet dieser Formatbezeichner unter dem Problem aller ‘plattformabhängigen’ Implementierungen, dass Sie nicht wirklich kontrollieren können, was Sie bekommen werden. Ich benutze ‘0x%p’ auf die Gefahr hin, am Anfang ein doppeltes 0x0X zu bekommen. Untergräbt eher die Verwendung, weil Sie genau wissen, was Sie mit %x bekommen.

    – Andy Krouwel

    9. Januar 15 um 10:32 Uhr

  • Dies scheint überhaupt nicht portierbar zu sein, selbst zwischen VC-Versionen. Beispielsweise stellt VS 2013 (12.0.40629.00 Update 5) „0X“ für „%#p“ voran, hat aber kein Präfix für „%p“. Aber VC 19.00.23506 hat weder ein Präfix für „%p“ noch „%#p“. Dann setzt G++ 5.4.0 „0x“ für „%p“ und „%#p“ voran (und die Verwendung von „%#p“ gibt eine G++-Warnung aus). Kurz gesagt, Sie können sich auf das Format davon überhaupt nicht verlassen.

    – James

    21. Februar 19 um 11:38 Uhr


1643915407 731 Wo ist p mit printf nutzlich
Tronik

Die Größe des Zeigers kann etwas anders sein als die von int. Auch eine Implementierung könnte eine bessere als einfache Hex-Wert-Darstellung der Adresse erzeugen, wenn Sie verwenden %p.

Wo ist p mit printf nutzlich
Philipp Ekberg

x ist Hexadezimale Ganzzahl ohne Vorzeichen (32 Bit)

p ist Zeigeradresse

Sehen printf in der C++-Referenz. Selbst wenn beide das gleiche schreiben würden, würde ich verwenden %p um einen Zeiger zu drucken.

  • Ja, die Seite habe ich schon durchgesehen. Was ich wissen wollte war, warum du es tun würdest use %p to print a pointer. Wie auch immer, die Antwort von Peter Hosey beantwortet meinen Zweifel.

    – Möb

    3. März 10 um 8:06 Uhr

1643915408 273 Wo ist p mit printf nutzlich
Albtx

Wenn Sie debuggen müssen, verwenden Sie printf with %p Option ist wirklich hilfreich. Sie sehen 0x0, wenn Sie einen NULL-Wert haben.

  • Ja, die Seite habe ich schon durchgesehen. Was ich wissen wollte war, warum du es tun würdest use %p to print a pointer. Wie auch immer, die Antwort von Peter Hosey beantwortet meinen Zweifel.

    – Möb

    3. März 10 um 8:06 Uhr

1643915408 800 Wo ist p mit printf nutzlich
codaddict

x wird verwendet, um das t-Zeigerargument hexadezimal auszugeben.

Eine typische Adresse beim Drucken mit %x würde aussehen wie bfffc6e4 und die vernünftige Adresse gedruckt mit %p wäre 0xbfffc6e4

  • Nein, %x wird verwendet, um einen Wert vom Typ zu drucken unsigned int in hexadezimal. Dafür gibt es absolut keine Garantie unsigned int ist genauso groß wie void *und es ist keine gute Idee, dies im Code anzunehmen.

    – abschalten

    5. Oktober 14 um 15:51 Uhr

.

759060cookie-checkWo ist `%p` mit printf nützlich?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy