当我在Xcode中的64位Intel中编译下面的代码时,我得到了这个输出。
#include<stdio.h>
#include<limits.h>
int main(void)
{
/* declare some integer variables */
long a = LONG_MAX;
long b = 2L;
long c = 3L;
/* declare some floating-point variables */
double d = 4.0;
double e = 5.0;
double f = 6.0;
printf("A variable of type long occupies %d bytes.", sizeof(long));
printf("\nHere are the addresses of some variables of type long:");
printf("\nThe address of a is: %p The address of b is: %p", &a, &b);
printf("\nThe address of c is: %p", &c);
printf("\nThe address of a-b is: %ld\nvalue of a is %ld\nValue of b is %ld\nsize of pointer %ld ", (&a-&c),a,b,sizeof(&a));
printf("\n\nA variable of type double occupies %d bytes.", sizeof(double));
printf("\nHere are the addresses of some variables of type double:");
printf("\nThe address of d is: %p The address of e is: %p", &d, &e);
printf("\nThe address of f is: %p\n", &f);
printf("\n size long - %d", sizeof(a));
return 0;
}
A variable of type long occupies 8 bytes. Here are the addresses of some variables of type long: The address of a is: 0x7fff5fbff880 The address of b is: 0x7fff5fbff878 The address of c is: 0x7fff5fbff870 The address of a-b is: 2 value of a is 9223372036854775807 Value of b is 2 size of pointer 8 A variable of type double occupies 8 bytes. Here are the addresses of some variables of type double: The address of d is: 0x7fff5fbff868 The address of e is: 0x7fff5fbff860 The address of f is: 0x7fff5fbff858 size long - 8
对我来说奇怪的是,a
和b
的地址之间的差异只有2.我希望它为8,这与长时间的字节数相匹配。有谁知道为什么会这样?
我在代码中输入了一个拼写错误&amp; a-&amp; c,但这确实与我的问题无关。我的问题是为什么从变量a的地址到变量b的地址只有2个字节的差异,当long是8个字节长并且我希望看到8的差异?
答案 0 :(得分:7)
指针算法基于它指向的类型的大小而不是以字节为单位,Pointer Arithmetic上的这个引用很好地涵盖了这个主题,你也有一个错字:
(&a-&c)
您实际上是从c
中减去a
。
这也是未定义的行为,因为仅当指针指向同一个数组时才定义指针减法,请参阅C11 draft standard
中的6.5.6/9
部分:
[...]当减去两个指针时,两个指针都指向同一个数组对象的元素,或者指向数组对象的最后一个元素的元素; [...]
第6.5.6/8
部分也是相关的:
[...]如果指针操作数和结果都指向同一个数组对象的元素,或者指向数组对象的最后一个元素,则评估不应产生溢出;否则,行为未定义。 [...]
答案 1 :(得分:4)
差异以sizeof(long)
为单位。为了强制它在字节方面取差异,你应该先抛出两个指针:
((char *)&a-(char *)&b)
这样,差异以sizeof(char)
为单位,即字节数
答案 2 :(得分:4)
首先,在印刷品中:
printf("\nThe address of a-b is: %ld\nvalue of a is %ld\nValue of b is %ld\nsize of pointer %ld ", (&a-&c),a,b,sizeof(&a));
您传递的内容是(&a-&c)
,而不是(&a-&b)
。传递&a-&b
,然后您将获得输出:
The address of a-b is: 1
为什么呢?可能编译器碰巧将a
,b
,c
放在串行内存中,看起来好像是一个数组,而在指针运算中,减法将返回元素的数量,而不是字节。
请注意,它是未定义的行为,因为指针算法仅在它们确实位于同一数组中时才有效,而它们不在您的示例中。
答案 3 :(得分:0)
我精神失常,忘了地址是十六进制的,而且是0x7fff5fbff880 - 0x7fff5fbff878 = 8(字节)
答案 4 :(得分:0)
编译器可能不会将变量放在彼此旁边,可能是因为它旁边的块没有8个空闲字节。另一个原因可能是字节的主要速度增加为64的倍数。