c指针引用和算术

时间:2015-01-20 02:01:11

标签: c pointers ubuntu gdb

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

1 个答案:

答案 0 :(得分:2)

  

*(x+1) = 10到底在做什么?

它重新解释x作为指向数组初始元素的指针,并尝试访问该“数组”的第二个成员(即索引为1的项目)。由于x既不是数组也不是指向数组的指针,因此赋值是未定义的行为。

  

xy的地址相距4个字节。

编译器就是这种情况。在其他系统上可能会有所不同,具体取决于许多因素,例如编译器,优化标志,指针大小,int的大小等。重要的是,无论x+1点在何处,取消引用都是非法的,因为x指向标量局部变量。