【问题标题】:Why do i have to initialize an array?为什么我必须初始化一个数组?
【发布时间】:2017-02-05 11:07:43
【问题描述】:

那么为什么我必须这样做“人[城市][年]=1000;”东西?

int People[2059][100];
for (int city = 0; city < 2059; city++)
for (int years = 0; years < 100; years++)
People[city][years] = 1000;

【问题讨论】:

  • 如果不初始化变量,它们将包含随机值。如果你不关心这个,你不必初始化你的数组。
  • 欢迎来到 Stack Overflow。请花时间阅读The Tour 并参考Help Center 中的材料,您可以在这里问什么以及如何问。
  • 未初始化的非静态本地(也称为“自动”)变量将具有 indeterminate 值。甚至使用它们来读取它们的值也会导致 C++ 中的未定义行为。在 C 中,读取它们的值是合法的,除非它是一个陷阱值。
  • 在不相关的注释中,您的数组将是 823600 字节大。局部变量通常存储在堆栈中,堆栈是有限的资源。例如,默认的 Windows 进程堆栈是一个兆字节。你的数组已经接近极限了。
  • @Someprogrammerdude “甚至读取它们的值” - 听起来有点像写入它们也是 UB。

标签: c++ c arrays initialization


【解决方案1】:

您不必这样做。但是People 数组将包含不确定的值,读取它们会导致程序具有未定义的行为(我假设它是一个具有自动存储持续时间的变量)。这不是一个过于有用的程序。

如果数组具有静态存储持续时间,则将其初始化为零。如果您对此感到满意,则不必循环它并立即分配值。

【讨论】:

    【解决方案2】:

    这一行:

    People[city][years] = 1000;
    

    将二维数组中的值初始化为堆栈上的1000。如果您不初始化数组中的数字,它们可以是任何东西。

    相反,您可以将People 中的数字初始化为0

    int People[2059][100] = {{0}}; /* or 1000, if you prefer that */
    

    使用它可以省去遍历数组并将每个值分配给0 的麻烦。如果您决定插入其他数字,则不需要初始化数组。

    【讨论】:

      猜你喜欢
      • 2020-05-31
      • 2019-03-31
      • 2012-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      • 2022-01-04
      相关资源
      最近更新 更多