c指针引用和算术
c pointer deferencing and arithmetic
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
what exactly is *(x+1) = 10
doing?
它将 x
重新解释为指向数组初始元素的指针,并尝试访问该 "array" 的第二个成员(即索引 1
处的项目) ).由于 x
既不是数组也不是指向数组的指针,因此赋值是未定义的行为。
The address of x
and y
are 4
bytes apart.
这恰好是你的编译器的情况。它在其他系统上可能会有所不同,这取决于许多因素,例如编译器、优化标志、指针的大小、int
的大小等。重要的是无论x+1
指向哪里,解引用都是非法的,因为x
指向一个标量局部变量
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
what exactly is
*(x+1) = 10
doing?
它将 x
重新解释为指向数组初始元素的指针,并尝试访问该 "array" 的第二个成员(即索引 1
处的项目) ).由于 x
既不是数组也不是指向数组的指针,因此赋值是未定义的行为。
The address of
x
andy
are4
bytes apart.
这恰好是你的编译器的情况。它在其他系统上可能会有所不同,这取决于许多因素,例如编译器、优化标志、指针的大小、int
的大小等。重要的是无论x+1
指向哪里,解引用都是非法的,因为x
指向一个标量局部变量