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
获胜根本不存在。
总的来说,你最好学习如何处理十六进制输出:-)
我有一个 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
获胜根本不存在。
总的来说,你最好学习如何处理十六进制输出:-)