当任何值分配给*(p + 1)时,为什么指针p的值发生了变化?

L's*_*rld 1 c pointers

#include <stdio.h>
int main(void){
    int* p = NULL;
    int y = 1;
    p = &y;
    printf("%p\n",p);
    *(p+1) = 10;
    printf("%p\n",p);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

0x7ffe2368f2e4
0x7ffe0000000a

我不知道为什么p在这里被改变了,第二个有"0000000a",最后是10,你能帮助我吗?谢谢.我用linux中的gcc编译它.

Zif*_*ion 5

这两个变量yp被分配在栈上.它们的存储彼此相邻,看起来像这样:

y: <addr1> <val1>  4 bytes
p: <addr2> <val2>  8 bytes
Run Code Online (Sandbox Code Playgroud)

需要注意的是<addr2><addr1> + 4.

对于您的示例,实际地址如下所示:

y: 0x00007ffe2368f2e4 <value1>  4 bytes
p: 0x00007ffe2368f2e8 <value2>  8 bytes
Run Code Online (Sandbox Code Playgroud)

y = 1p = &y,内存看起来像如下:

y: 0x00007ffe2368f2e4 0x00000001          4 bytes
p: 0x00007ffe2368f2e8 0x00007ffe2368f2e4  8 bytes
Run Code Online (Sandbox Code Playgroud)

p + 1是的值p+ sizeof(int),这是0x00007ffe2368f2e4 + 4,其是0x00007ffe2368f2e8,它是地址p.

*(p + 1) = 10设置4个字节0x00007ffe2368f2e810.

这将覆盖8字节值的0x00007ffe2368f2e84个字节,即4个字节的值p.

0x7ffe 2368f2e4
0x7ffe 0000000a ------> this is the lower 4 bytes set to 10 i.e. 0xa
Run Code Online (Sandbox Code Playgroud)