Care este diferența utilizării\% p,\% u și\% x pentru tipărirea adresei variabile în C?


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

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *