#include<stdio.h>
int main()
{
    int i, j;
    int *pi,*pj;
    pi=&i;
    pj=&j;

    printf("pi-pj=%d\n",pi-pj);
    return 0;
}

我在不同的编译器上尝试了此代码,但是每次获得相同的结果时,谁能帮助我了解为什么它是相同的?

Ouput:
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 ~]$

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

关于c - 此C代码的输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6515278/

10-15 01:59