为什么打印的变量地址的形式类似于0x7fff935ad2b0?

时间:2012-03-05 21:53:22

标签: c

我只是编写一个简单的程序来打印变量的地址。

#include <stdio.h>

void main(){
  int *a;
  int b;

  b=5;
  a=&b;

  printf("\n*a is the value of the integer:  %d\n",*a);
  printf("&a is the address of variable a: %p\n", &a);
  printf(" a is the address stored in a:   %p\n",a);
  printf("&b is the address of variable b: %p\n\n",&b);
}

结果是:

*a is the value of the integer:  5
&a is the address of variable a: 0x7fff935ad2b0
 a is the address stored in a:   0x7fff935ad2bc
&b is the address of variable b: 0x7fff935ad2bc

为什么打印的地址不是标准格式?

抱歉这个愚蠢的问题,但我不明白。

修改

我有另一个程序

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct small{
  int a;
};

int main(){
   struct small *sm;

   sm = malloc(sizeof(struct small));
   memset(sm,0,sizeof(struct small));

   sm->a = 5;

   printf("The address of sm is: %p\n", &sm);
   printf("The address stored in sm is: %p\n", sm);

   return 0;
}

输出结果为:

The address of sm is: 0x7fffd1363158
The address stored in sm is: 0x17a3010

所以我预计格式0x17a3010对我来说有些标准。

在这种情况下,为什么%p的格式不同?

5 个答案:

答案 0 :(得分:9)

标准没有说明%p应采用何种格式。

  

参数应该是指向void的指针。指针的值是   转换为一系列可打印字符   实施定义的方式

因此,通常这将是十六进制的,因为在使用地址时它是最舒适的。

答案 1 :(得分:2)

这称为十六进制,即base-16。它使得以字节为单位比二进制或基数10更容易查看位组。我不确定我理解你的问题。没有“标准形式”,但如果有一个,那就是它。

根据你的编辑:

  

输出结果为:

     

sm的地址是:0x7fffd1363158   存储在sm中的地址是:0x17a3010   所以我预计格式0x17a3010对我来说有点标准。

     

在这种情况下,为什么%p的格式不同?

这两个完全一样。 0x17a30100x00000000017a3010没有区别。

答案 2 :(得分:1)

  

所以我预计格式0x17a3010对我来说有些标准。

     

在这种情况下,为什么%p的格式不同?

我认为这只是因为该数字的上半部分全部为零,所以它被截断,正是你通常用1而不是0000000000001写的。

这两个地址可能是如此遥远,因为一个地址在堆栈上,另一个地址在堆上,而这两个地址恰好位于系统虚拟地址空间的两端(这实际上是很常见的)实现)。

答案 3 :(得分:1)

看起来您习惯于使用较低值的地址,例如0x17a3010,而是看到了较高的值,例如0x7fffd1363158。您对此类值中的位数增加感到惊讶。

不要惊慌;在你的情况下,显然,较低的值表示“堆”中的位置,较高的值表示“堆栈”中的位置。

两个指针值都不比另一个更“标准”;由于虚拟地址空间的各个部分恰好在哪里,它们只是位于频谱的不同端。

答案 4 :(得分:-2)

%p格式说明符以十六进制格式化地址;这是内存地址的通用格式。