在C中声明的未初始化变量会发生什么?它有价值吗?如果在CI写:int num;在我分配任何东西之前num,是num不确定的价值?
3 回答
明月笑刀无情
TA贡献1828条经验 获得超4个赞
静态变量(文件范围和函数静态)初始化为零:
int x; // zeroint y = 0; // also zerovoid foo() { static int x; // also zero}
非静态变量(局部变量)是不确定的。在分配值之前读取它们会导致未定义的行为。
void foo() { int x; printf("%d", x); // the compiler is free to crash here}
在实践中,它们最初只是有一些荒谬的价值 - 一些编译器甚至可能会在查看调试器时输入特定的固定值以使其显而易见 - 但严格来说,编译器可以自由地执行从崩溃到召唤的任何操作恶魔通过你的鼻腔通道。
至于为什么它是未定义的行为而不是简单的“未定义/任意值”,有许多CPU架构在其各种类型的表示中具有额外的标志位。一个现代的例子是Itanium,它的寄存器中有一个“Not a Thing”位 ; 当然,C标准起草人正在考虑一些较旧的架构。
尝试使用设置了这些标志位的值可能会导致操作中的CPU异常确实不应该失败(例如,整数加法或分配给另一个变量)。如果你继续保留未初始化的变量,编译器可能会设置这些标志位的随机垃圾 - 意味着触摸未初始化的变量可能是致命的。
长风秋雁
TA贡献1757条经验 获得超7个赞
它取决于变量的存储持续时间。具有静态存储持续时间的变量始终隐式初始化为零。
对于自动(本地)变量,未初始化的变量具有不确定的值。除其他外,不确定值意味着您可能“看到”该变量中的“值”不仅不可预测,甚至不能保证稳定。例如,在实践中(即忽略UB一秒钟)此代码
int num;int a = num;int b = num;
不保证变量a
并且b
将接收相同的值。有趣的是,这不是一些迂腐的理论概念,这在实践中很容易作为优化的结果发生。
所以一般来说,流行的答案“它是用内存中的垃圾进行初始化”甚至都不是很正确的。未初始化的变量的行为是一个变量的不同初始化垃圾。
- 3 回答
- 0 关注
- 1054 浏览
添加回答
举报
0/150
提交
取消