Beste antwoord
Als u een adres van iets wilt afdrukken , of de inhoud van een pointervariabele, is de enige echt draagbare manier om dit te doen het gebruik van de\% p formaatspecificatie. De C-standaard stelt dat de afgedrukte karakters implementatie-gedefinieerd zijn, maar in de praktijk genereren de meeste C-bibliotheekimplementaties een reeks hexadecimale cijfers die het adres vertegenwoordigen.
De\% u en\% x formaatspecificaties verwachten een geheel getal zonder teken en druk de waarde af in respectievelijk decimaal en hexadecimaal. Ze verwachten geen adres .
Als u\% u of\% x (of iets anders dan\% p) gebruikt om te proberen een adres afdrukken, het lijkt misschien te werken in sommige omgevingen, maar zal in feite ongedefinieerd gedrag en niet-draagbaar . U kunt er niet van uitgaan dat de grootte van een aanwijzer gelijk is aan de grootte van een geheel getal zonder teken (of een ander gegevenstype met gehele getallen). In veel 64-bits omgevingen is een geheel getal zonder teken bijvoorbeeld 32 bits. Als het aantal bits in een pointer niet overeenkomt met het aantal bits in een geheel getal zonder teken in uw omgeving, en u probeert\% u of\% x te gebruiken om een adres af te drukken, krijgt u een onjuiste uitvoer en de uitvoer van volgende items in dezelfde aanroep naar printf kunnen ook onjuist zijn.
Dus als je een adres gaat afdrukken, gebruik dan altijd de\% p formaatspecificatie, voor draagbare code die ongedefinieerd gedrag vermijdt. Ga er nooit vanuit dat de grootte van een aanwijzer hetzelfde is als de grootte van een ander gegevenstype C.
Antwoord
Alleen de \%p
conversie begrijpt correct een pointer. De \%p
-conversie drukt een pointer af op een implementatiespecifieke manier.
De \%u
en \%x
conversies zijn voor unsigned int
of int
typen, die al dan niet dezelfde grootte hebben als een aanwijzertype. De \%u
conversie drukt een ongetekend decimaal geheel getal af, terwijl \%x
een ongetekend hexadecimaal geheel getal in kleine letters afdrukt.
Aan een aanwijzer afdrukken met \%u
of \%x
, u moet de aanwijzer naar een int
of unsigned int
. Die cast kan informatie verliezen als sizeof(void *) > sizeof(int)
.
Zie ook: printf, fprintf, sprintf, snprintf, printf\_s , fprintf\_s