【发布时间】:2021-04-21 17:04:24
【问题描述】:
我有一个int 指针,它指向另一个int 的地址。
当使用格式说明符 %p 打印指针时(正如 Stack Overflow 上的许多答案所建议的那样),它会以 十六进制 表示形式打印。
如何使用 十进制 表示形式打印指针的值?
代码示例
我发现可以使用this answer 中的%zu。
int i = 1;
int *p = &i;
printf("Printing p: %%p = %p, %%zu = %zu\n", p, p);
当我使用 https://onlinegdb.com/EBienCIJnm 运行该代码时
- 它实际上以十进制打印正确的值
- 但是它也会输出一个编译器警告
warning: format ‘%zu’ expects argument of type ‘size_t’, but argument 3 has type ‘int *’ [-Wformat=]
Printing p: %p = 0x7ffee623d8c4, %zu = 140732759529668
有没有办法以十进制表示 printf 指针的值,而不会出现编译器警告?
【问题讨论】:
-
unsigned long addr = (unsigned long)p;printf("Printing addr: %lu\n",addr);这有什么问题吗? -
是的,看起来
%lu与(unsigned long)的演员组合也可以正常工作 (onlinegdb.com/OpOSsz6Oq)。我也喜欢它,因为它不像其他答案那样需要<stdint.h>和/或<inttypes.h>的#include。 @IrAM,这是一个独立于平台的解决方案(因为它需要指针的大小为unsigned long)?好像来自this Quora answer,并不总是unsigned long的大小 -
我不是 100% 确定可移植性,但我的想法是根据平台选择可用的最长类型,以便您可以正确地表示十进制地址。我想任何平台都可以关注
short <= int <= long <= long long。
标签: c pointers printf memory-address format-string