Jaký je rozdíl v použití\% p,\% u a\% x pro tisk proměnné adresy v jazyce C?


Nejlepší odpověď

Pokud potřebujete vytisknout adresu něčeho nebo obsah proměnné ukazatele, jediný skutečně přenosný způsob, jak to udělat, je použít specifikátor formátu\% p. Standard C uvádí, že vytištěné znaky jsou definované implementací, ale v praxi většina implementací knihovny C generuje sekvenci hexadecimálních číslic představujících adresu.

Specifikátoři formátu\% u a\% x očekávají celé číslo bez znaménka a vytiskněte hodnotu v desítkovém a šestnáctkovém pořadí. Neočekávají adresu .

Pokud použijete\% u nebo\% x (nebo cokoli jiného než\% p) k pokusu o vytiskne adresu, se může zdát, že funguje v některých prostředích, ale ve skutečnosti to bude nedefinované chování a nepřenosné . Nelze předpokládat, že velikost ukazatele je stejná jako velikost nepodepsaného celého čísla (nebo jiného celočíselného datového typu). Například v mnoha 64bitových prostředích je celé číslo bez znaménka 32 bitů. Pokud počet bitů v ukazateli neodpovídá počtu bitů v celé číslo bez znaménka ve vašem prostředí a pokusíte se použít\% u nebo\% x k tisku adresy, dostanete nesprávný výstup a výstup následujících položky ve stejném volání printf mohou být také nesprávné.

Takže pokud chcete tisknout adresu, vždy použijte specifikátor formátu\% p pro přenosný kód, který se vyhne nedefinovanému chování. Nikdy nepředpokládejte, že velikost ukazatele je stejná jako velikost jakéhokoli jiného datového typu C.

Odpovědět

Pouze \%p převod správně chápe ukazatel. Konverze \%p vytiskne ukazatel konkrétním způsobem implementace.

\%u a \%x převody jsou pro unsigned int nebo int typy, které mohou nebo nemusí mít stejnou velikost jako typ ukazatele. Konverze \%u vytiskne desetinné celé číslo bez znaménka, zatímco \%x vytiskne šestnáctkové celé číslo bez znaménka.

Komu vytisknout ukazatel buď \%u nebo \%x, budete muset vrhnout ukazatel na int nebo unsigned int. Toto obsazení může přijít o informace, pokud sizeof(void *) > sizeof(int).

Viz také: printf, fprintf, sprintf, snprintf, printf\_s , fprintf\_s

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *