gpt4 book ai didi

c - 如果我将 printf 方法中的所有 %X 替换为 %p 会怎样

转载 作者:行者123 更新时间:2023-12-05 08:49:39 26 4
gpt4 key购买 nike

%X 用于打印十六进制%p 用于打印指针,十六进制

我知道使用 %x 而不是 %p 可能会导致十六进制值被截断,从而导致不准确。

当使用 %p 而不是 %x 打印十六进制时,唯一的缺点是 MSB 处有大量的 0。

那么,在任何情况下我都不能使用 %p 来替换 %x

最佳答案

您必须首先完全理解为什么如果您尝试使用 %x 格式说明符打印地址,这些值会被截断。

如果您将地址传递给 printf,将会有一定数量的字节传递给该函数。大小由 sizeof(void*) 定义。如果您随后告诉 printf 您想要格式化为十六进制格式的 int 值(通过使用 %x),则 printf 将只读取与 int 参数相关的字节数,即 sizeof(int)。 (实际上 unsigned int 类型的值是预期的。但这与 int 类型具有相同的大小,并且在将值传递给 printf 时类型 int 或更小,它只会被转换为类型 int。)如果这些值不匹配,将会留下一些多余的字节,当下一个参数将被转换。或者可用字节较少,printf 将读取无效内存。

如果您在相反的方向上欺骗 printf,也会出现同样的问题。然后您将仅传递与 int 相关的字节数,但 printf 将获取指针中的字节数。这又会引起麻烦。

因此只需使用正确的格式说明符即可。

顺便说一句:%p 的格式不一定以十六进制格式完成。如果您有一些 CPU 架构,其中指针在页面/偏移值中拆分,您可能会得到类似 ff80:0010 的内容,而不是单个十六进制数。

关于c - 如果我将 printf 方法中的所有 %X 替换为 %p 会怎样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63617669/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com