int main(void)
{
int *x = 0;
int y = 0;
x = &y
*x = 1
*(x+1) = 10
return 0;
}
当我执行*(x+1) = 10
并尝试打印x的地址时,它会指向0x7fff0000000a
并在我尝试打印出x Cannot access memory at address 0x7fff0000000a
在*(x+1) = 10
之前,x的地址显示为(int *) 0x7fffffffe4d4
,x的值显示为1
我的问题是,*(x+1) = 10
到底在做什么? x和y的地址相隔4个字节。由于x指向y,并且x加1,因此应该指向x本身
x的地址:
(int **) 0x7fffffffe4d8
地址y:
(int *) 0x7fffffffe4d4
答案 0 :(得分:2)
*(x+1) = 10
到底在做什么?
它重新解释x
作为指向数组初始元素的指针,并尝试访问该“数组”的第二个成员(即索引为1
的项目)。由于x
既不是数组也不是指向数组的指针,因此赋值是未定义的行为。
x
和y
的地址相距4
个字节。
编译器就是这种情况。在其他系统上可能会有所不同,具体取决于许多因素,例如编译器,优化标志,指针大小,int
的大小等。重要的是,无论x+1
点在何处,取消引用都是非法的,因为x
指向标量局部变量。