В чем разница между printf ("% d", "% u", "% p", ptr, ptr, ptr) и printf ("% d% u% p", ptr, ptr, ptr)? - PullRequest
0 голосов
/ 23 июня 2019

Когда я пытаюсь выполнить printf ("% p", "% d", "% u", ptr, ptr, ptr), я получаю 00405067, но когда я пытаюсь выполнить printf ("% p% d% u", ptr, ptr, ptr) я получаю 0061FF28 6422312 6422312 соответственно. Я понимаю последнюю часть, но не уверен насчет первой.

int main()
{
    int  a = 1;
    int *ptr;
    ptr = &a;
    printf("%p","%d","%u",ptr,ptr,ptr);
    return 0;
}
Output: 00405067
________________

int main()
{
    int  a = 1;
    int *ptr;
    ptr = &a;
    printf("%p %d %u",ptr,ptr,ptr);
    return 0;
}
Output: 0061FF28 6422312 6422312

1 Ответ

3 голосов
/ 23 июня 2019

В

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...