我只是编写一个简单的程序来打印变量的地址。
#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的格式不同?
答案 0 :(得分:9)
标准没有说明%p
应采用何种格式。
参数应该是指向void的指针。指针的值是 转换为一系列可打印字符 实施定义的方式。
因此,通常这将是十六进制的,因为在使用地址时它是最舒适的。
答案 1 :(得分:2)
这称为十六进制,即base-16。它使得以字节为单位比二进制或基数10更容易查看位组。我不确定我理解你的问题。没有“标准形式”,但如果有一个,那就是它。
根据你的编辑:
输出结果为:
sm的地址是:0x7fffd1363158 存储在sm中的地址是:0x17a3010 所以我预计格式0x17a3010对我来说有点标准。
在这种情况下,为什么%p的格式不同?
这两个完全一样。 0x17a3010
与0x00000000017a3010
没有区别。
答案 2 :(得分:1)
所以我预计格式0x17a3010对我来说有些标准。
在这种情况下,为什么%p的格式不同?
我认为这只是因为该数字的上半部分全部为零,所以它被截断,正是你通常用1而不是0000000000001写的。
这两个地址可能是如此遥远,因为一个地址在堆栈上,另一个地址在堆上,而这两个地址恰好位于系统虚拟地址空间的两端(这实际上是很常见的)实现)。
答案 3 :(得分:1)
看起来您习惯于使用较低值的地址,例如0x17a3010
,而是看到了较高的值,例如0x7fffd1363158
。您对此类值中的位数增加感到惊讶。
不要惊慌;在你的情况下,显然,较低的值表示“堆”中的位置,较高的值表示“堆栈”中的位置。
两个指针值都不比另一个更“标准”;由于虚拟地址空间的各个部分恰好在哪里,它们只是位于频谱的不同端。
答案 4 :(得分:-2)
%p
格式说明符以十六进制格式化地址;这是内存地址的通用格式。