我打印出以下两个。它在同一台机器上运行,我不知道为什么这里打印的地址长度不同。
打印输出命令:
fprintf(stderr, "Prepare, size: %d, offset: %d, addr: %p\n", buf_sz, offset, buf);
输出:
Prepare, size: 16384, offset: 5799936, addr: 0x614000
另一个打印输出命令:
fprintf(stderr, "offset: %d, size: %d, base: %p\n", l_offset[i], size, base);
输出:
offset: 5799936, size: 16384, base: 0x2b2b95fc6000
我有一个关于打印出buf和base的问题。为什么两者的长度不同?我认为他们应该有相同的长度,但不同的值来表示地址。
如果您需要更多信息,请与我们联系。
答案 0 :(得分:3)
对于如何使用%p
打印指针几乎没有保证,标准只强制要求“某些实现定义的方式”:
7.21.6.1
fprintf
函数
p
参数应该是指向void
的指针。指针的值是 转换为一系列打印字符,在实现定义中 方式。
因此,实现必须记录它的打印方式,但可以自由选择任何合适的格式,例如“十六进制不带前导零,包括前缀0x
”(这是%#X
的变体,具有合适的格式长度和转换后的参数)。
如果该表示对于两个指针具有不同数量的有效(非前导零)数字,则会得到不同长度的输出。
答案 1 :(得分:0)
这些是在同一个程序的同一次运行中完成的吗?程序编译方式不同吗?优化不同?我曾经在DOS上使用Borland C编程,它可以编译和链接不同的内存模型,所有这些都可以在同一台机器上运行。
在编译,链接和运行期间可能会发生很多不同的事情。编译将把代码减少到处理器理解的机器语言。这些指针可能有近指针和远指针,具体取决于指针的目标是否在同一个内存页面上。是一个本地声明的变量,在这种情况下它可能已经在运行时堆栈上分配,而另一个变量是全局的,可能已经在堆上分配了?
我会尝试过多地阅读实际的指针值。