地址的打印输出长度不同

时间:2014-10-18 16:27:16

标签: c

我打印出以下两个。它在同一台机器上运行,我不知道为什么这里打印的地址长度不同。

打印输出命令:

   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的问题。为什么两者的长度不同?我认为他们应该有相同的长度,但不同的值来表示地址。

如果您需要更多信息,请与我们联系。

2 个答案:

答案 0 :(得分:3)

对于如何使用%p打印指针几乎没有保证,标准只强制要求“某些实现定义的方式”:

  

7.21.6.1 fprintf函数

     

p参数应该是指向void的指针。指针的值是   转换为一系列打印字符,在实现定义中   方式。

因此,实现必须记录它的打印方式,但可以自由选择任何合适的格式,例如“十六进制不带前导零,包括前缀0x”(这是%#X的变体,具有合适的格式长度和转换后的参数)。

如果该表示对于两个指针具有不同数量的有效(非前导零)数字,则会得到不同长度的输出。

答案 1 :(得分:0)

这些是在同一个程序的同一次运行中完成的吗?程序编译方式不同吗?优化不同?我曾经在DOS上使用Borland C编程,它可以编译和链接不同的内存模型,所有这些都可以在同一台机器上运行。

在编译,链接和运行期间可能会发生很多不同的事情。编译将把代码减少到处理器理解的机器语言。这些指针可能有近指针和远指针,具体取决于指针的目标是否在同一个内存页面上。是一个本地声明的变量,在这种情况下它可能已经在运行时堆栈上分配,而另一个变量是全局的,可能已经在堆上分配了?

我会尝试过多地阅读实际的指针值。