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