Use the format specifier %p
:
printf("variable A is at address: %p\n", (void*)&A);
The standard requires that the argument is of type void*
for %p
specifier. Since, printf
is a variadic function, there’s no implicit conversion to void *
from T *
which would happen implicitly for any non-variadic functions in C. Hence, the cast is required. To quote the standard:
7.21.6 Formatted input/output functions (C11 draft)
p The argument shall be a pointer to void. The value of the pointer is converted to a sequence of printing characters, in an implementation-defined manner.
Whereas you are using %x
, which expects unsigned int
whereas &A
is of type int *
. You can read about format specifiers for printf from the manual. Format specifier mismatch in printf leads to undefined behaviour.