在Xcode中寻址C程序

时间:2013-08-04 03:06:28

标签: c xcode pointers

当我在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

对我来说奇怪的是,ab的地址之间的差异只有2.我希望它为8,这与长时间的字节数相匹配。有谁知道为什么会这样?


我在代码中输入了一个拼写错误&amp; a-&amp; c,但这确实与我的问题无关。我的问题是为什么从变量a的地址到变量b的地址只有2个字节的差异,当long是8个字节长并且我希望看到8的差异?

5 个答案:

答案 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

为什么呢?可能编译器碰巧将abc放在串行内存中,看起来好像是一个数组,而在指针运算中,减法将返回元素的数量,而不是字节。

请注意,它是未定义的行为,因为指针算法仅在它们确实位于同一数组中时才有效,而它们不在您的示例中。

答案 3 :(得分:0)

我精神失常,忘了地址是十六进制的,而且是0x7fff5fbff880 - 0x7fff5fbff878 = 8(字节)

答案 4 :(得分:0)

编译器可能不会将变量放在彼此旁边,可能是因为它旁边的块没有8个空闲字节。另一个原因可能是字节的主要速度增加为64的倍数。