int main(){
int *p=0;
printf("%d",++p);
}
在我的机器中,我的输出为 4;我最初认为 *p 指向地址 0 并且它的递增从 0 指向地址 4。
后者我声明 *p = -1; 我认为应该抛出错误,因为 -1 不能是地址,但它会打印“3”:(
请让我知道这里发生了什么。提前致谢。
int *p=0
在地址 0 处声明一个指针。
++p
将该指针增加主机特定的sizeof int
. 这是您系统上的 4 个字节。
int *p=-1
给你一个带有地址的指针0xffffffff
(假设是 32 位指针)
++p
相当于0xffffffff + 4
which is 0x100000003
. 这会溢出 32 位 int,留下0x00000003
.
未定义的行为。
当你说:
int* p = 0;
您正在声明一个指向 null 的指针(或nullptr
在 C++11 中)。那么当你这样做时:
printf("%d", ++p);
您正在打印指针的位置,但您传递的格式字符串不正确,这是未定义的。
它恰好起作用,因为在您的体系结构中,int 与指针的大小相同。它说4
因为添加1
到您的指针会移动地址的整数大小,在您的情况下为 4 个字节。
我们可以检查 C 标准来决定 C 实现是否应该允许负指针。但是,-1 可能是有效的地址值(32 位中的 0xffffffff),并且增加它会导致 0xffffffff + 4 = 0x03。