В
printf("%p","%d","%u",ptr,ptr,ptr)
Строка формата просто "%p"
. Он печатает один указатель, который является адресом "%d"
(строковый литерал). Остальные аргументы ("%u", ptr, ptr, ptr
) не имеют соответствующей директивы в строке формата, поэтому они просто игнорируются.
Вызов фактически эквивалентен
printf("%p", "...");
Обратите внимание, что %p
принимает void *
, а %d
- int
, а %u
- unsigned int
. Если вы хотите напечатать значение указателя, правильное решение - использовать %p
и привести указатель к (void *)
, как в
printf("%p\n", (void *)ptr);
Чтобы отформатировать указатель как целое число, я считаю, что единственное 100% переносимое решение - это
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
...
printf("%" PRIuPTR "\n", (uintptr_t)(void *)ptr);