Hvad er forskellen ved at bruge\% p,\% u og\% x til udskrivning af variabel adresse i C?


Bedste svar

Hvis du har brug for at udskrive en adresse på noget , eller indholdet af en markørvariabel, er den eneste virkelig bærbare måde at gøre det på at bruge formatet\% p-format. C-standarden siger, at de udskrevne tegn er implementeringsdefinerede, men i praksis genererer de fleste C-biblioteksimplementeringer en sekvens af hexadecimale cifre, der repræsenterer adressen.

Formatformaterne\% u og\% x forventer et usigneret heltal og udskriv værdien i henholdsvis decimal og hexadecimal. De forventer ikke en adresse .

Hvis du bruger\% u eller\% x (eller noget andet end\% p) til at forsøge at udskrive en adresse, det ser muligvis ud til at fungere i nogle miljøer, men vil faktisk være udefineret adfærd og ikke-bærbar . Du kan ikke antage, at størrelsen på en markør er den samme som størrelsen på et usigneret heltal (eller enhver anden heltal datatype). For eksempel er et usigneret heltal i mange 64-bit miljøer 32 bit. Hvis antallet af bits i en markør ikke svarer til antallet af bits i et usigneret heltal i dit miljø, og du forsøger at bruge\% u eller\% x til at udskrive en adresse, får du forkert output og output fra efterfølgende elementer i samme kald til printf kan også være forkerte.

Så hvis du vil udskrive en adresse, skal du altid bruge formatet\% p format til bærbar kode, der undgår udefineret adfærd. Antag aldrig, at størrelsen på en markør er den samme som størrelsen på nogen anden C-datatype.

Svar

Kun \%p konvertering forstår en markør korrekt. \%p konvertering udskriver en markør på en implementeringsspecifik måde.

\%u og \%x konverteringer er til unsigned int eller int typer, som måske eller måske ikke har samme størrelse som en markørtype. \%u konvertering udskriver et usigneret decimaltal, mens \%x udskriver et usigneret hexadecimalt heltal med små bogstaver.

Til udskriv en markør med enten \%u eller \%x, skal du kaste markøren til en int eller unsigned int. Denne rollebesætning kan miste information, hvis sizeof(void *) > sizeof(int).

Se også: printf, fprintf, sprintf, snprintf, printf\_s , fprintf\_s

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *