是什么让这个程序代码打印4

时间:2012-11-21 14:01:51

标签: c memory pointers undefined

int main(){
  int *p=0;
  printf("%d",++p);
}

在我的机器中,我的输出为4;我最初认为* p指向地址0并且它的递增指向从0开始的地址4.

后者我声明* p = -1;我认为应该抛出错误,因为-1不能是一个地址,但它打印“3”:(

请让我知道这里发生了什么。提前谢谢。

3 个答案:

答案 0 :(得分:11)

int *p=0在地址0处声明一个指针。
++p通过特定于主机的sizeof int递增该指针。这是您系统上的4个字节。

int *p=-1为您提供一个地址为0xffffffff的指针(假设为32位指针)
++p相当于0xffffffff + 4 0x100000003。这会溢出一个32位的int,只剩下0x00000003

答案 1 :(得分:4)

未定义的行为。

当你说:

int* p = 0;

您声明指向null(或C ++ 11中的nullptr)。然后当你这样做:

printf("%d", ++p);

您正在打印指针的位置,但是您传递的格式字符串不正确,这是未定义的。

它恰好起作用,因为在您的体系结构中,int与指针的大小相同。它说4因为向指针添加1会将地址移动一个整数的大小,在你的情况下是4个字节。

答案 2 :(得分:0)

我们可以检查C标准,判断C实现是否应该允许否定指针。但是,-1可能是有效的地址值(32位的0xffffffff),并且递增它会导致0xffffffff + 4 = 0x03。