为了账号安全,请及时绑定邮箱和手机立即绑定

C ++中未初始化的变量行为

C ++中未初始化的变量行为

C++
慕运维8079593 2019-12-04 15:11:42
我检查过自己,写了这样的程序int main() { int i; cout << i; return 0;}我运行了几次程序,结果一直都是零。我已经在C中尝试过,结果是一样的。但是我的教科书说如果不初始化在函数内部定义的变量,则变量值将保持未定义状态,这意味着该元素将采用以前驻留在内存中该位置的任何值。当程序始终为变量分配空闲存储位置时,这怎么可能?怎么可能不是零(我假设默认的可用内存值为零)?
查看完整描述

3 回答

?
HUWWW

TA贡献1874条经验 获得超12个赞

如果不初始化在函数内部定义的变量,则变量值将保持未定义状态。

这是真的。

这意味着元素将采用先前驻留在内存中该位置的任何值。

这不是。

有时在实践中会发生这种情况,您应该意识到对于程序的任何给定运行,获取零不获取零都完全适合此理论。

从理论上讲,如果需要,编译器实际上可以为该整数分配一个随机初始值,因此尝试对此进行合理化完全没有意义。但是,让我们继续前进,就好像我们假设“该元素采用先前位于内存中该位置的任何值”一样…

怎么可能不是零(我假设默认的可用内存值为零)?

好吧,这就是您假设时发生的情况。:)


查看完整回答
反对 回复 2019-12-04
?
四季花海

TA贡献1811条经验 获得超5个赞

该代码调用未定义行为(UB),因为未初始化使用了指针。


使用警告标志时,编译器应发出警告,-Wall例如:


warning: 'i' is used uninitialized in this function [-Wuninitialized]

  cout << i;

          ^

碰巧的是,在您的系统上,此运行时它的值为0。这意味着该变量被分配给的垃圾值恰好为0,因为那里的内存剩余表明了这一点。


但是,请注意,内核零点相对经常出现。这意味着我可以得到零作为系统输出是很常见的,但是并不能保证也不应该将其视为承诺。


查看完整回答
反对 回复 2019-12-04
  • 3 回答
  • 0 关注
  • 604 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信