#include<stdio.h>
int main()
{
int i, j;
int *pi,*pj;
pi=&i;
pj=&j;
printf("pi-pj=%d\n",pi-pj);
return 0;
}
我在不同的编译器上尝试了这个代码,但每次我得到相同的结果时,有人可以帮助我理解为什么它是一样的吗?
输出:
pi -pj = 3
我很困惑,因为内存通常是连续分配的。所以,如果让我们说,我们的系统堆栈向下增长,我们有&i = 0xA
,然后是j(&j) = 0x6
的地址(因为整数是4个字节)。现在,当我们打印这两个int
指针值之间的差异时,输出应为"1"
。但它将以"3"
的形式出现。那是为什么?
答案 0 :(得分:5)
我无法复制您的体验。在Linux x86上使用gcc
:
[wally@lenovotower ~]$ cat t.c
#include<stdio.h>
int main()
{
int i, j;
int *pi,*pj;
pi=&i;
pj=&j;
printf("pi-pj=%d\n",pi-pj);
return 0;
}
[wally@lenovotower ~]$ gcc -o t t.c
[wally@lenovotower ~]$ ./t
pi-pj=1
[wally@lenovotower ~]$
这意味着i
和j
相邻。指针减法返回指针之间的项数,而不是地址差。为了得到你的结果,两者之间必须有两个填充物。我无法解释这是怎么回事。