C - printf - Adresse ausgeben mit %p

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
starcow
Establishment
Beiträge: 428
Registriert: 23.04.2003, 17:42
Echter Name: Mischa Schaub

C - printf - Adresse ausgeben mit %p

Beitrag von starcow »

Ich bin auf folgende Diskussion gestossen, im Zusammenhang mit const.

Code: Alles auswählen

printf("&A = %p\n",&A);
I'd recommend a cast to a pointer to void if you're using the %p conversion specifier. Sure it might seem to work how it's supposed to on most implementations even without the cast, but to be pedantic, this is undefined behavior.
The %p conversion specifier expects a pointer to void, and if any argument is not the correct type for the corresponding conversion specification, the behavior is undefined.

From the C standard draft n1570 (The fprintf function) (didn't write exactly where it is in the standard draft, because YouTube doesn't seem to like it if you put a lot of numbers in your comment) (emphasis mine):
p The argument shall be a **pointer to void**. The value of the pointer is converted to a sequence of printing characters, in an implementation-defined manner.
Stimmt das tatsächlich? Ist es ohne den cast nach void pointer ein "undefined behavior"? Müsste ich also immer in einen void pointer casten, ehe ich eine Adresse ausgebe?

Code: Alles auswählen

int x;
printf("%p", (void*)&x);
Gruss starcow
Freelancer 3D- und 2D-Grafik
mischaschaub.com
Benutzeravatar
Schrompf
Moderator
Beiträge: 4514
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: C - printf - Adresse ausgeben mit %p

Beitrag von Schrompf »

Standards kann ich Dir nicht sagen, aber ich weiß, dass jeder Pointer implizit zu void* konvertiert. Und die varargs, die u.A. bei printf() verwendet werden, haben ein eigenes Set an Konvertierungsregeln. Wer weiß, ob da was drin steht, was alle Pointer automatisch zu void* konvertiert?
Häuptling von Dreamworlds. Baut an was Neuem. Hilft nebenbei nur höchst selten an der Open Asset Import Library mit.
Benutzeravatar
Krishty
Establishment
Beiträge: 7850
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: C - printf - Adresse ausgeben mit %p

Beitrag von Krishty »

Es stimmt. Die Ausgabe von %p erfordert void *. Variable Parameterlisten promoten zwar ihre Operanden (so dass etwa aus short automatisch ein int wird), ändern aber nicht den Typ von Zeigern. Das hat man offen gelassen, weil der C-Standard dem Compiler Spielraum bei der Implementierung von Zeigern gibt, und deshalb ein int * nicht zwingenderweise identisch einem void * ist (weder in Größe noch Inhalt).

Beachte, dass das wirklich ein Detail von %p ist, und nicht an der variablen Parameterlist liegt – wenn du bspw. scanf() nutzt, um ein int zu füllen, musst du sogar einen int * ohne Cast zu void * übergeben.

(P.S.: Ist eine Erklärung, aber keine Rechtfertigung. Ich hasse diesen Cast. Aber auch ich muss mich dran halten.)
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
starcow
Establishment
Beiträge: 428
Registriert: 23.04.2003, 17:42
Echter Name: Mischa Schaub

Re: C - printf - Adresse ausgeben mit %p

Beitrag von starcow »

Puuh! Ok, gut zu wissen! Danke euch.
Freelancer 3D- und 2D-Grafik
mischaschaub.com
Benutzeravatar
starcow
Establishment
Beiträge: 428
Registriert: 23.04.2003, 17:42
Echter Name: Mischa Schaub

Re: C - printf - Adresse ausgeben mit %p

Beitrag von starcow »

Kann das sein, dass Carmack in seinem Talk mit Lex genau dieses Problem als eine der Hauptursachen von Bugs in ihrem eigenen Code nennt? :-)

https://youtu.be/I845O57ZSy4?t=3802

Kontext:
https://youtu.be/I845O57ZSy4?t=3408
Freelancer 3D- und 2D-Grafik
mischaschaub.com
Benutzeravatar
Krishty
Establishment
Beiträge: 7850
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: C - printf - Adresse ausgeben mit %p

Beitrag von Krishty »

Nicht speziell %p, aber durchaus genau diese Klasse von Bugs, ja.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Antworten