每个进程创建的内存地址都是虚拟地址,操作系统使用了虚拟化技术,让进程觉得它拥有了大块可支配的内存的假象,操作系统拿到这个地址后会将它转变为真实的内存地址,从而拿到对应的信息。比如下面这段代码:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
printf("location of code : %p\n", (void *)main);
printf("location of heap : %p\n", (void *)malloc(1));
int x = 3;
printf("location of stack : %p\n", (void *)&x);
return x;
}
输出: