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指向一个标量局部变量