Mi a különbség a\% p,\% u és a\% x használatával a változó címének nyomtatásához C-ben?


Legjobb válasz

Ha valaminek címét kell kinyomtatnia , vagy egy mutatóváltozó tartalma, ennek egyetlen igazán hordozható módja a\% p formátummeghatározó használata. A C szabvány azt állítja, hogy a kinyomtatott karakterek implementáció által definiáltak, de a gyakorlatban a legtöbb C könyvtár megvalósítás a címet képviselő hexadecimális számok sorozatát generálja.

A\% u és a\% x formátummeghatározók előjel nélküli egész számra számítanak és tizedes, illetve hexadecimális értékkel nyomtassa ki az értéket. Nem várnak címet .

Ha a\% u vagy a\% x (vagy a\% p kivételével bármi mással) próbálkozik címet kinyomtatva, előfordulhat, hogy működik bizonyos környezetekben, de valójában undefined viselkedés és nem hordozható . Nem feltételezheti, hogy a mutató mérete megegyezik az aláíratlan egész (vagy bármely más egész típusú adattípus) méretével. Például sok 64 bites környezetben az előjel nélküli egész szám 32 bit. Ha egy mutatóban lévő bitek száma nem egyezik meg a környezetében egy előjel nélküli egész szám bitjeinek számával, és megpróbálja a\% u vagy a\% x értéket használni egy cím nyomtatásához, akkor hibás kimenetet kap, és az ezt követő Az ugyanazon printf-hívásban szereplő elemek szintén helytelenek lehetnek.

Tehát, ha címet akar nyomtatni, akkor mindig használja a\% p formátummeghatározót a hordozható kódhoz, amely elkerüli a meghatározatlan viselkedést. Soha ne feltételezzük, hogy a mutató mérete megegyezik bármely más C adattípus méretével.

Válasz

Csak a \%p az átalakítás helyesen érti a mutatót. A \%p konverzió végrehajtásspecifikus módon nyomtat mutatót.

A \%u és konverziók unsigned int vagy int típusokra vonatkoznak, amelyek mérete nem azonos méretű, mint a mutató típusa. A \%u konverzió aláíratlan decimális egész számot, míg a \%x kisbetűvel aláíratlan hexadecimális egész számot nyomtat.

nyomtasson egy mutatót a \%u vagy a \%x elemre, akkor a mutatót egy int vagy unsigned int. Ez a szereplő elveszítheti az információkat, ha sizeof(void *) > sizeof(int).

Lásd még: printf, fprintf, sprintf, snprintf, printf\_s , fprintf\_s

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük