arrays - 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。
这可能是因为数组没有被隐式初始化。但总是这样吗?当我想要特定行为时,我是否总是必须初始化我的数组,或者在某些情况下编译器会自动执行此操作?它依赖于编译器吗?
还有一个几乎最重要的问题:这种行为在哪里指定?(我的论文需要引用)
解决方案
任何在本地定义的不是 not 的变量(不仅仅是数组)static
,或更正式地说是那些具有自动存储持续时间的变量,都不会被隐式初始化。那些在文件范围或 with 定义的static
,即那些具有静态存储持续时间的,被隐式初始化为 0 或 NULL。
这在C 标准的第 6.7.9p10 节中有详细说明:
如果具有自动存储持续时间的对象未显式初始化,则其值是不确定的。如果具有静态或线程存储持续时间的对象未显式初始化,则:
- 如果是指针类型,则初始化为空指针;
- 如果它具有算术类型,则将其初始化为(正或无符号)零;
- 如果是聚合,则根据这些规则(递归)初始化每个成员,并将任何填充初始化为零位;
- 如果是联合,则根据这些规则(递归)初始化第一个命名成员,并将任何填充初始化为零位;
当然,仅仅因为未初始化的变量恰好为 0 并不意味着它不包含垃圾。
推荐阅读
- python - 为什么这个 python 程序会占用这么多内存?
- powerbi - 如何获取列的第一个实例
- java - 如何检查字符串中每个子字符串中出现字符串的次数?
- python - 为什么 Python 在 list.reverse() 上返回 None?
- python - 比较两个列表的元素并为第二个列表添加例外?
- java - 为什么此方法存在逻辑错误。isPalindrome(11) 应该返回 true,但它返回 false
- python - 如何将屏幕与 Python 中的屏幕截图进行比较
- c# - 从uri获取读写流
- r - R purrr::map() & mutate():根据列表中的变量添加许多新列
- google-cloud-platform - DataBricks + Kedro 与 GCP + Kubeflow 与服务器 + Kedro + Airflow