全局变量何时归入.bss与.data段?跨模块使用未初始化全局变量方法
C语言中.bss段的实际作用与跨模块使用未初始化全局变量的问题
一、.bss段的实际使用场景
你的理解是对的:代码里的int i = 7;会被存在.data段(存储已显式初始化且非0的全局/静态变量),int j;会被存在.bss段。.bss段的核心价值和使用场景主要有两点:
- 存储未显式初始化的全局/静态变量,以及显式初始化为0的全局/静态变量(编译器会自动把这类变量放到.bss,因为0是默认值,不需要在可执行文件里存储具体数值)
- 节省可执行文件体积:.bss段在磁盘上的可执行文件中不占用实际存储空间,只是记录需要分配的内存大小。程序启动时,操作系统会自动把.bss段的内存区域统一初始化为0。比如你定义1000个未初始化的全局
int,.bss段只需要标记要分配4000字节的内存,而如果把这些变量都初始化为0放在.data段,就要在可执行文件里实打实占4000字节的空间。
二、跨模块使用未初始化全局变量的方法
是的,在另一个模块中只需要写extern int j;就可以正确引用当前模块定义的j。需要注意两个细节:
extern int j;是声明而非定义,它只是告诉编译器“j是一个在其他模块定义的int类型全局变量”,不要在该模块里再重复定义j(比如不能再写int j;,否则会触发多重定义的编译错误)- 全局变量默认具有外部链接属性,所以只要用
extern声明,就能在其他模块访问到这个未初始化的j,不需要额外的编译/链接配置。
内容的提问来源于stack exchange,提问作者user18348324
相关产品推荐
相关产品推荐

