通常,可执行文件的数据段包含已初始化的全局/静态变量,而 BSS 段包含未初始化的全局/静态变量。
当加载器将您的程序加载到内存中时,未初始化的全局/静态变量会自动填充零。
在 C 中,函数内部的静态变量(初始化与否)仅意味着变量具有局部/函数范围(有时称为内部静态),但它们仍然存在于 Data/BSS 段中,具体取决于它们是否被初始化。
所以无论 fun() 被调用多少次,静态变量只会在程序加载时初始化一次。
定义为静态且在任何函数之外的变量仍然存在于数据或 bss 段中,但仅具有文件范围。
编译代码时,每个目标文件都有一个导入和导出列表,供链接编辑器使用。您的静态变量将不在导出列表中,因此其他目标文件无法访问。
通过排除 static 关键字,您的全局变量被放置在导出列表中,并且可以被其他对象模块引用,并且链接编辑器将能够在创建可执行文件时找到符号。
对于图片视图:
+--------- TEXT ---------+ Low memory
| main() |
| fun() |
+--------- DATA ---------+
| int a (global scope) |
| int c (file scope) |
| int e (function scope) |
+---------- BSS ---------+
| int b (global scope) |
| int d (file scope) |
| int f (function scope) |
+------------------------+