8

为什么这两个地址之间的差异是错误的? http://codepad.org/NGDqFWjJ

#include<stdio.h>
int main()
{
   int i = 10, j = 20;
   int *p = &i;
   int *q = &j;
   int c = p - q;
   printf("%d\n", p);
   printf("%d\n", q);
   printf("%d", c);
   return 0;
}

输出:

-1083846364
-1083846368
1
4

3 回答 3

25

首先,在不相关的指针上执行指针算术时没有定义。

其次,说得通。减去指针时,您会得到这些地址之间的元素数,而不是字节数。

如果你想试试

char *p1 = &i, *p2 = &j;

你会得到不同的结果。


作为旁注,%p在打印指针时使用。

于 2012-03-24T20:49:04.997 回答
13

正如其他人所说,您得到的结果是指针指向的类型大小的倍数。将它们转换为 char 指针,您得到的结果将以字节为单位。此外,您应该使用ptrdiff_t 类型,以便在具有 64 位指针的系统上,该类型应该足够大以保存结果。

ptrdiff_t c = (char*)p - (char*)q;

另请注意,标准中未定义不在同一数组中的两个值的地址差异,但对每个系统都有效。

于 2012-03-24T20:55:21.690 回答
2

严格来说,您的程序会导致几种未定义的行为,首先是由于不相关指针上的指针运算,然后是打印语句中的格式字符串和参数不匹配。但是,即使这些已得到纠正,您也会看到相同的结果。差异为 1 的原因是因为指针算术以指向类型的大小为单位给出结果 - 在您的情况下int是 4 字节类型,因此减去int *指向 4 字节的指针会产生 1 的结果。

于 2012-03-24T20:52:02.263 回答