int main(){
int *p=0;
printf("%d",++p);
}
在我的机器中,我的输出为4;我最初认为* p指向地址0并且它的递增指向从0开始的地址4.
后者我声明* p = -1;我认为应该抛出错误,因为-1不能是一个地址,但它打印“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。