//Global space
int A;
int B = 0;
int C = 0x01;
static int D;
static int E = 0;
static int F = 0x01;
void foo()
{
static int G;
static int H = 0;
static int I = 0x01;
}
Run Code Online (Sandbox Code Playgroud)
我的理解是,所有未显式初始化或初始化为 0 的全局变量和静态变量都将进入 BSS 部分。所有使用 0 以外的值初始化的全局变量和静态变量都将进入 DATA 部分。我对吗?
在这种情况下,以下内容是正确的。
A -- BSS (No Explicit init)
B -- BSS (init to 0)
C -- DATA (!= 0)
D -- BSS
E -- BSS
F -- DATA
G -- BSS
H -- BSS
I -- DATA
Run Code Online (Sandbox Code Playgroud)
请纠正我或认可我。提前致谢。
在 C 中,每个具有静态存储持续时间的对象都会被初始化。如果您不编写显式初始化程序,它将隐式初始化为零。只有具有自动存储(在堆栈上)的对象才是真正未初始化的。
这是从编译器的角度来看的。如果您选择编辑链接描述文件,显然会得到不同的结果。正常的链接描述文件将执行以下操作:
大多数编译器会将 C、F 和 I 放入.data.
大多数编译器会将 B、D、E、G 和 H 放入.bss.
唯一有趣的是A;许多编译器会将其放入COMMON.
带选项的 GCC-fno-common会将 A 放入.bss.
在某些平台上的最新版本的 GCC 中,此选项默认打开。