为啥我必须初始化一个数组?

Posted

技术标签:

【中文标题】为啥我必须初始化一个数组?【英文标题】: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。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

这一行:

People[city][years] = 1000;

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

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

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

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

【讨论】:

以上是关于为啥我必须初始化一个数组?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能使用'0x80000000'来初始化一个int数组?

为啥我收到警告说必须初始化一个不可为空的字段(当我确定我正在初始化它时)?

java 为啥数组这里要用大括号?

为啥我的数组列表即使在初始化后也会抛出空指针异常?

C语言数组初始化的问题?为啥我初始化了,数组长度还为0啊,如图

为啥我可以从 初始化常规数组,而不是 std::array