#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编译它.
这两个变量y和p被分配在栈上.它们的存储彼此相邻,看起来像这样:
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 = 1和p = &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个字节0x00007ffe2368f2e8到10.
这将覆盖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)