Cel mai bun răspuns
Dacă trebuie să imprimați o adresă de ceva , sau conținutul unei variabile pointer, singurul mod cu adevărat portabil de a face acest lucru este să folosiți specificatorul de format\% p. Standardul C afirmă că caracterele tipărite sunt definite de implementare, dar în practică, majoritatea implementărilor bibliotecii C generează o secvență de cifre hexazecimale care reprezintă adresa.
Specificatorii de format\% u și\% x așteaptă un număr întreg nesemnat și tipăriți valoarea în zecimal și, respectiv, hexazecimal. Ei nu așteaptă o adresă .
Dacă utilizați\% u sau\% x (sau orice altceva decât\% p) pentru a încerca să tipăriți o adresă, ar putea părea să funcționeze în unele medii, dar va fi de fapt comportament nedefinit și neportabil . Nu puteți presupune că dimensiunea unui indicator este aceeași cu dimensiunea unui număr întreg nesemnat (sau a oricărui alt tip de date întregi). De exemplu, în multe medii pe 64 de biți, un număr întreg nesemnat este de 32 de biți. Dacă numărul de biți dintr-un pointer nu se potrivește cu numărul de biți dintr-un număr întreg nesemnat din mediul dvs. și încercați să utilizați\% u sau\% x pentru a imprima o adresă, veți obține o ieșire incorectă și ieșirea următoarei articolele din același apel către printf pot fi, de asemenea, incorecte.
Deci, dacă doriți să imprimați o adresă, utilizați întotdeauna specificatorul de format\% p, pentru codul portabil care evită comportamentul nedefinit. Nu presupuneți niciodată că dimensiunea unui pointer este aceeași cu dimensiunea oricărui alt tip de date C.
Răspundeți
Numai \%p
conversia înțelege corect un indicator. Conversia \%p
imprimă un indicator într-un mod specific implementării.
\%u
și \%x
conversiile sunt pentru tipurile unsigned int
sau int
, care pot avea sau nu aceeași dimensiune ca un tip de pointer. Conversia \%u
tipărește un număr întreg zecimal nesemnat, în timp ce \%x
tipărește un număr întreg hexazecimal nesemnat cu litere mici.
tipăriți un pointer fie cu \%u
, fie cu \%x
, va trebui să aruncați indicatorul pe un int
sau unsigned int
. Distribuția respectivă poate pierde informații dacă sizeof(void *) > sizeof(int)
.
Vezi și: printf, fprintf, sprintf, snprintf, printf\_s , fprintf\_s