我有以下C代码:
//declared at the beginning of the CAStar.c file:
int TERRAIN_PASSABLE = 1;
int TERRAIN_IMPASSABLE = 0;
int TERRAIN_SOME_WHAT_PASSABLE = 2;
我注意到,对于这些变量中的任何一个,如果它们具有非零值,则the "nm" command将它们报告为类型“D”(已初始化):
_TERRAIN_PASSABLE |00000008| D |
_TERRAIN_SOME_WHAT_PASSABLE|00000004| D |
但是,初始化为0的那些报告为“B”(未初始化):
_TERRAIN_IMPASSABLE |00000000| B |
为什么“初始化为0”和“用0以外的其他东西初始化”之间的区别?
答案 0 :(得分:5)
这或多或少是关于BSS如何工作以及如何使用它。 B表示变量将被放置在BSS部分(你是对的,它是未初始化的数据部分)。 D表示符号位于初始化数据部分。
阅读例如this文章,了解更多关于BSS的工作原理及其用途。
答案 1 :(得分:4)
这些变量很可能在文件范围内声明,为它们提供静态存储持续时间。
出于优化目的,具有静态存储持续时间的所有变量由编译器/链接器分为两类:初始化为0或初始化为其他。初始化为零的变量放在通常称为.bss
的内存段中,而初始化为其他值的变量放在.data
中。
这样做的原因是,如果在相邻内存中分配.bss
变量,则可以更快地初始化memset
个变量。基本上,它们将使用单个{{1}}进行初始化。此外,它将减少所需的ROM数量。 Releated question with details.
编辑
.bss变量最终未初始化的原因可能是因为C语言中存在一条规则(C11 6.7.9 / 10),声明所有静态存储持续时间变量未被程序员明确初始化(它们是“未初始化”),应初始化为零