输出此C代码

时间:2011-06-29 02:54:16

标签: 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;
}

我在不同的编译器上尝试了这个代码,但每次我得到相同的结果时,有人可以帮助我理解为什么它是一样的吗?

输出:

pi -pj = 3

我很困惑,因为内存通常是连续分配的。所以,如果让我们说,我们的系统堆栈向下增长,我们有&i = 0xA,然后是j(&j) = 0x6的地址(因为整数是4个字节)。现在,当我们打印这两个int指针值之间的差异时,输出应为"1"。但它将以"3"的形式出现。那是为什么?

1 个答案:

答案 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 ~]$ 

这意味着ij相邻。指针减法返回指针之间的项数,而不是地址差。为了得到你的结果,两者之间必须有两个填充物。我无法解释这是怎么回事。