Mitä eroa on\% p,\% u ja\% x käyttämisessä muuttujan osoitteen tulostamiseen C: ssä?


Paras vastaus

Jos haluat tulostaa jonkin osoitteen , tai osoitinmuuttujan sisältö, ainoa todella kannettava tapa tehdä se on käyttää\% p-muotoilua. C-standardin mukaan painetut merkit ovat toteutuksen määrittelemiä, mutta käytännössä useimmat C-kirjastototeutukset tuottavat sarjan heksadesimaalilukuja, jotka edustavat osoitetta.

\% u- ja\% x -määritteet odottavat allekirjoittamatonta kokonaislukua. ja tulosta arvo desimaaleina ja heksadesimaaleina, vastaavasti. He eivät odota osoitetta .

Jos yrität käyttää\% u tai\% x (tai muuta kuin\% p) tulosta osoite, se saattaa näyttää toimivan joissakin ympäristöissä, mutta itse asiassa se on määrittelemätöntä käyttäytymistä ja ei kannettavia . Et voi olettaa, että osoittimen koko on sama kuin allekirjoittamattoman kokonaisluvun (tai muun kokonaislukutietotyypin) koko. Esimerkiksi monissa 64-bittisissä ympäristöissä allekirjoittamaton kokonaisluku on 32 bittiä. Jos osoittimen bittien lukumäärä ei vastaa ympäristössäsi olevan allekirjoittamattoman kokonaisluvun bittien määrää ja yrität käyttää osoitetta\% u tai\% x tulostamaan osoitteen, saat virheellisen tuloksen ja seuraavien tulostuksen samassa printf-kutsussa olevat kohteet voivat myös olla virheellisiä.

Jos siis aiot tulostaa osoitteen, käytä aina\% p-muotomääritintä kannettavaan koodiin, joka välttää määrittelemätöntä toimintaa. Älä koskaan oleta, että osoittimen koko on sama kuin minkä tahansa muun C-tietotyypin koko.

Vastaa

Vain \%p muuntaminen ymmärtää osoittimen oikein. \%p -muunnos tulostaa osoittimen toteutuskohtaisella tavalla.

\%u ja \%x -konversiot ovat tyyppejä unsigned int tai int, jotka voivat olla tai eivät olla samankokoisia kuin osoitintyyppi. \%u -muunnos tulostaa allekirjoittamattoman desimaaliluvun, kun taas \%x tulostaa allekirjoittamattoman heksadesimaaliluvun pienillä kirjaimilla.

tulosta osoitin joko \%u tai \%x, sinun on heitettävä osoitin int tai unsigned int. Tämä näyttelijä saattaa menettää tietoja, jos sizeof(void *) > sizeof(int).

Katso myös: printf, fprintf, sprintf, snprintf, printf\_s , fprintf\_s

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *