#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"
的形式出现。这是为什么?
最佳答案
我无法复制您的体验。在 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
是相邻的。指针减法返回指针之间的项数,而不是地址差。为了得到你的结果,必须有两个项目之间的填充。我无法解释那是怎么回事。
关于c - 此 C 代码的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6515278/