这涉及到操作系统知识,而且这个似乎没写在教科书上。
C编译后的指令都写在可执行文件之中。所有指令地址都是从文件某个偏移开始的。
当操作系统加载可执行程序并分配进程时,会为每个进程分配自己的独有内存空间。
虽然两个进程的某个内存地址数值相同,但他们物理内存地址绝不相同,进程的独立内存空间只是对物理内存的一种映射关系而已。
再回到可执行指令加载话题。程序一般都有很多跳转指令,它需要一个绝对内存地址,这个就要求操作系统在加载进程时,分配一个进程基础地址,然后在所有跳转指令,以及某些全局变量地址中根据基础地址调整内存地址。
不只是进程加载,其实动态库加载都会涉及跳转指令地址调整问题。
当然,早期系统,例如dos系统,没有这套机制,它的程序内存地址都可以看作物理地址。但就现代操作系统来说,都是有这套机制的。