如何/何时将内存分配给C中的全局变量

Ava*_*ons 2 c

我知道C内存布局和二进制形成过程.我对有关何时以及谁为全局变量分配地址的阶段有疑问/疑问.

extern int dummy;  //Declared in some other file  
int * pTest = &dummy;
Run Code Online (Sandbox Code Playgroud)

这段代码汇编得很好.只有在为其分配地址时,pTest才会有虚拟地址.我想知道虚拟变量在哪个阶段(编译或链接器)获取地址?

Pau*_*vie 6

编译器说:

int *pTest = &<where is dummy?>;
Run Code Online (Sandbox Code Playgroud)

链接器说:

int *pTest= &<dummy is here>;
Run Code Online (Sandbox Code Playgroud)

装载机说:

int *pTest= <dummy is at 0x1234>;
Run Code Online (Sandbox Code Playgroud)

这种稍微简化的解释试图传达以下内容:

  • 编译器识别外部变量dummy被用于

  • 链接器标识此变量所在的位置和模块

  • 但只有将可执行程序放入内存后,才会知道变量的实际位置,并且加载器会将此实际地址放在所有dummy使用的位置.