c - 此 C 代码的输出

标签 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" 的形式出现。这是为什么?

最佳答案

我无法复制您的体验。在 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/

相关文章:

c - 使用c生成单色位图图像

c - C 中的 Realloc 核心转储错误

c - 打开 MP 性能不佳/令人困惑

java - JNI 栈顺序误解

c - 这在c中是什么意思?大括号内的方括号

c++ - 加权 boolean 值 - 缩放

c - 为什么以下程序的输出是 2 97 而不是 2 2?

c - 从 2 位分支预测器到 8 位预测器

c - 声明指向 3 x 3 数组的指针并使用指针打印它

C 为什么要循环第一项?