C 如何在没有编译器警告的情况下将地址打印为十进制值(非十六进制)

C how to print address as a decimal value (not hex) without compiler warnings

我有一个 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 以十进制表示的指针值,没有编译器警告?

转换为 <stdint.h> 中定义的 uintptr_t 类型并使用 <inttypes.h> 中定义的 PRIuPTR 说明符格式化:

#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("%" PRIuPTR "\n", (uintptr_t) &argc);
}

将指针转换为 uintmax_t(在 <stdint.h> 中定义),并使用 %ju:

打印转换结果
printf("Printing p: %%p = %p, %%ju = %ju\n", p, (uintmax_t)p);

请注意,不能保证 uintmax_t 的宽度足以容纳指针,但可能没问题。 (如果它不适合您的平台,编译器可能会抱怨。)您可以使用 uintptr_t,如其他地方所建议的,但如果 uintmax_t 不够宽,则 uintptr_t 获胜根本不存在。

总的来说,你最好学习如何处理十六进制输出:-)