c - 使用 printf 打印变量的内存地址时,为什么 %x 和 %p 返回不同但相似的值?

标签 c

我正在尝试打印变量(特别是 argc)的内存地址。我正在使用 printf,我知道 %x 返回一个无符号的十六进制整数,而 %p 返回一个指针地址。下面是我的简单代码,供引用

int main (int argc, char **argv) {
  printf("argc: addr=%x addrp=%p val=%x\n",&argc,&argc,argc);
  return 0;
}

这样跑:./a.out 这是

它输出:argc: addr=af5144cc addrp=0x7ffcaf5144cc val=3

我看到 %x 返回一个字节的地址,对吗?因为它有 8 个数字或位?

但是,%p 返回的是相同的字节,前面有更多信息。什么是“0x7ffc”部分,它是什么意思?它是内存地址的一部分还是指出了某种类型的信息?我知道 0x 部分表示它是一个十六进制数。 %x 或 %p 是真正的内存地址吗?谢谢!

最佳答案

%x 打印一个 unsigned int,在大多数现代平台上,它是 32 位的。

%p 打印特定于平台的指针值。
有些平台是 32 位的,有些是 64 位的(也可能有其他大小)

sizeof(unsigned int) 往往等于sizeof(void*),但完全不能保证,常见的见32位unsigned int 与 64 位 void*

结果,%x%p 打印出不同的宽度。

关于c - 使用 printf 打印变量的内存地址时,为什么 %x 和 %p 返回不同但相似的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46980733/

相关文章:

c++ - 不断结合优化编译器

objective-c - 继续检查直到 True

c - 如何修复链表的 C 代码中的此错误?

c - 基本程序,有趣的输出?解释

c - 一种在C中进行位操作的方法

将两个列表的笛卡尔积创建到 C 中的新列表中

c - 以几 Kbit/s 的恒定速率发送 UDP 消息的程序以 3Mbit/s 发送它们?

c - 字符串赋值的指针。错误: expression is unassignable

c - 错误加载模块 undefined symbol : luaL_setfuncs

c - 使用c在oracle中插入空白blob数据