繁体   English   中英

变长数组是否以 C 中的默认 0 值开头?

[英]Do variable length arrays start with default 0 values in C?

我知道我无法使用显式提供的值在 C 中初始化可变长度数组 支持以下代码:

void main() {
  int l = 2;
  float test[l] = {1.0, 2.0};  // my compiler says: "Variable-sized object may not be initialized"
}

我的问题是:如果我不尝试给出任何值:

void main() {
  int l = 2;
  float test[l];
}

... 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM