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

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

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

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

4

3 回答 3

11

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

int *p=-1给你一个带有地址的指针0xffffffff(假设是 32 位指针)
++p相当于0xffffffff + 4which is 0x100000003. 这会溢出 32 位 int,留下0x00000003.

于 2012-11-21T14:05:28.323 回答
4

未定义的行为。

当你说:

int* p = 0;

您正在声明一个指向 null 的指针(或nullptr在 C++11 中)。那么当你这样做时:

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

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

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

于 2012-11-21T14:04:12.567 回答
0

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

于 2012-11-21T14:08:29.640 回答