【问题标题】:C++ Initialize Array Waste ValueC++ 初始化数组废值
【发布时间】:2021-04-08 16:01:57
【问题描述】:

我经常犯错误,没有初始化数组的值。 从理论上讲,我们知道在这种情况下,安排应该有浪费的价值。

然而,在实践中,许多值被初始化为零。 因此,程序对小例子感到满意。 这使得调试变得困难。

你能告诉我为什么会这样吗?

【问题讨论】:

  • 也看看这里,特别是初始化数组的部分:cplusplus.com/doc/tutorial/arrays
  • 没有所谓的“浪费价值”。访问未初始化的数组元素(或变量)的值会产生未定义的行为 - 即相关的 C 或 C++ 标准没有定义 - 甚至没有约束 - 会发生什么,因此访问未初始化的数组元素可能会给出 042 ,它可能会擦除您的硬盘驱动器,或执行其他操作 - 根据标准,所有这些可能性都是正确的结果。一些(但不是全部)主机系统在将内存提供给您的程序之前将其初始化为零。真正的解决方案是让您确保所有变量或数组都已初始化
  • 你是说你初始化了一个数组的一些值,但不是全部?如果是这种情况,那么任何未显式初始化的元素都将设置为 0。

标签: c++ arrays c


【解决方案1】:

在简单的测试用例中,未初始化的值通常看起来为零,因为现代操作系统在将其交给进程之前会先空白内存作为安全预防措施。如果您的程序已经运行了一段时间,这将不成立,所以不要依赖它。这适用于自动(堆栈)变量和堆分配。对于堆栈分配,它实际上更糟糕,因为变量可以采用变量不可能正常包含的值,可能会彻底崩溃您的程序。在处理 Itanium 处理器时,即使将未初始化的整数变量分配给另一个变量,它也可能因内存故障而崩溃。

或者在 DOS 下试试。它不会工作,因为 DOS 不会清空内存。

另一方面,static 和全局分配如果未按标准初始化,则保证为零。

【讨论】:

    【解决方案2】:

    如果您想收到有关未初始化内存的警告,g++ 和 clang++ 都支持 Memory Sanitizer。只需将-fsanitize=memory 添加到您的编译器标志中,当您读取未初始化的内存时就会出现运行时错误。

    【讨论】:

      猜你喜欢
      • 2017-07-21
      • 1970-01-01
      • 1970-01-01
      • 2013-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-03
      • 1970-01-01
      相关资源
      最近更新 更多