在C中,为什么我初始化为0 int变量被“nm”报告为未初始化?

时间:2013-12-10 10:10:25

标签: c variables initialization nm

我有以下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以外的其他东西初始化”之间的区别?

2 个答案:

答案 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),声明所有静态存储持续时间变量未被程序员明确初始化(它们是“未初始化”),应初始化为零

相关问题