首页 > 解决方案 > C:我必须初始化函数中使用的数组吗?

问题描述

在调试我的程序时,我注意到我的二维数组的一些元素包含非零值。

float Ak[2][2];
Ak[0][0] = 1;
Ak[1][1] = 1;

当我运行此代码Ak[0][0]并且Ak[1][1]按预期为 1 但Ak[0][1]实际上是 1.081 时,我预计为 0。

这可能是因为数组没有被隐式初始化。但总是这样吗?当我想要特定行为时,我是否总是必须初始化我的数组,或者在某些情况下编译器会自动执行此操作?它依赖于编译器吗?

还有一个几乎最重要的问题:这种行为在哪里指定?(我的论文需要引用)

标签: arrayscinitialization

解决方案


任何在本地定义的不是 not 的变量(不仅仅是数组)static,或更正式地说是那些具有自动存储持续时间的变量,都不会被隐式初始化。那些在文件范围或 with 定义的static,即那些具有静态存储持续时间的,被隐式初始化为 0 或 NULL。

这在C 标准的第 6.7.9p10 节中有详细说明:

如果具有自动存储持续时间的对象未显式初始化,则其值是不确定的。如果具有静态或线程存储持续时间的对象未显式初始化,则:

  • 如果是指针类型,则初始化为空指针;
  • 如果它具有算术类型,则将其初始化为(正或无符号)零;
  • 如果是聚合,则根据这些规则(递归)初始化每个成员,并将任何填充初始化为零位;
  • 如果是联合,则根据这些规则(递归)初始化第一个命名成员,并将任何填充初始化为零位;

当然,仅仅因为未初始化的变量恰好为 0 并不意味着它不包含垃圾。


推荐阅读