Sekcja 7.18.1.4 standardowych stanach C99:Czy konwersja na `void *` jest wymagana przed konwersją wskaźnika na `uintptr_t` i na odwrót?
Poniższy typ wyznacza unsigned całkowitą o tej własności, że każdy ważny wskaźnik do
void
można przeprowadzić tego typu, a następnie przekształcany z powrotem do wskaźnik dovoid
, a wynik będzie porównać równe oryginalnej palików:
uintptr_t
Czy to oznacza, że tylko typy void *
mogą zostać zastąpione uintptr_t
i powrotem bez zmiany wartości wskaźnika początku?
W szczególności chciałbym wiedzieć, czy następujący kod jest wymagane do korzystania uintptr_t
:
int foo = 42;
void * bar = &foo;
uintptr_t baz = bar;
void * qux = baz;
int quux = *(int *)qux; /* quux == foo == 42 */
Albo jeśli to prostsza wersja jest gwarantowana przez standard C99 doprowadzić do tego samego efektu:
int foo = 42;
uintptr_t bar = &foo;
int baz = *(int *)bar; /* baz == foo == 42 */
Czy konieczna jest konwersja na void *
przed konwersją wskaźnika na uintptr_t
i na odwrót?
Tak, wymagany jest rzut pośredni do 'void *' (lub kwalifikowana wersja 'void *'). –
@IanAbbott Czy znasz uzasadnienie standardu, aby wymagać tego pośredniego odlewania do 'void *'? –