[英]Do variable length arrays start with default 0 values in C?
变长数组默认不初始化,不能显式初始化,除非内存分配例程如calloc
可以初始化空间。
C 2018 6.7.6.2(“数组声明符”)2 说:
…如果标识符被声明为具有静态或线程存储持续时间的对象,则它不应具有可变长度数组类型。
因此,可变长度数组的存储持续时间必须是其他存储持续时间之一:自动或分配 [6.2.4 1]。 (有一个临时存储期,但仅适用于结构或联合 [6.2.4 7]。)
6.7.9 10 说默认情况下不初始化具有自动存储持续时间的对象:
如果没有明确初始化具有自动存储持续时间的对象,则其值是不确定的……
此外,6.7.9 3 说你不能显式初始化可变长度数组:
要初始化的实体类型应为未知大小的数组或非可变长度数组类型的完整对象类型。
很高兴接受更有据可查的答案,但根据经验,答案是否定的:内存不是零初始化的。
以下代码的变体经常(但不总是!)中止:
int main() {
int l = 99;
float test[l];
assert(test[0] == 0.0);
assert(test[42] == 0.0);
return 0;
}
因此,除非我确定要初始化每个成员,否则有必要自己将其设置为已知状态,例如
int main() {
int l = 99;
float test[l];
memset(test, 0, sizeof test);
// …now the array content is in a known state…
}
我相信C++ 的行为不同,这可能是我记得的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.