【发布时间】:2013-12-10 10:10:25
【问题描述】:
我有以下 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 以外的其他东西初始化”之间的区别?
【问题讨论】:
-
这可能是一种优化,编译器不会将堆变量初始化为零,因为它期望操作系统将内存清零……不过只是猜测。
-
@ypnos 好吧,老实说,我也有这样的想法。但是后来,我留下了其中一个真正未初始化的变量(只是:“int TERRAIN_SOME_WHAT_PASSABLE;”)。这次变量被报告为“C”,因此(再次)与使用 0 初始化时不同(也与使用非 0 初始化时不同)。
-
因为 ld.so 将所有内容初始化为零。与应用程序的运行时内存分配无关 (@ypnos) - 只是意味着运行时链接器不必将变量设置为任何特殊的值。
-
请澄清这些变量的声明位置,因为它很重要。目前,所有答案都只是猜测变量是在文件范围内声明的(“全局变量”)。
-
@Lundin 你说得对,我要更新代码 sn-p。对不起,谢谢。
标签: c variables initialization nm