0

我有两个 C++ 代码,其中一个具有全局 int 数组,而另一个代码具有一个本地数组,其长度由用户输入确定(因此在运行时)。两个数组都没有显式初始化。

#include <iostream>
using namespace std;
int M = 1000;
int a[M];
int main() {
  for(int i = 0; i < M; i++)
    cout << a[i];
  cout << endl; 
}
#include <iostream>
using namespace std;
int main() {
  int M;
  cin >> M;
  int a[M];
  for(int i = 0; i < M; i++)
    cout << a[i];
  cout << endl; 
}

我观察到全局数组用零填充,而本地数组(其长度在运行时确定)没有用零填充,而是用随机数填充(但一次相同)。我使用了 g++ 编译器。

这是什么行为?C++ 标准是否定义了这种行为?

4

2 回答 2

3

这是什么行为?

行为是具有静态存储持续时间的对象在任何其他初始化(如果有)之前被初始化为零。

所有其他存储持续时间的行为是没有额外的零初始化。

C++ 标准是否定义了这种行为?

是的,标准中定义了静态对象的零初始化。读取不确定值的行为被指定为未定义。

这两个程序都是格式错误的,因为(非动态)数组的大小必须是编译时常量,而M事实并非如此。

于 2020-02-17T18:03:01.323 回答
0

来自 C++ 17 标准(11.6 初始化程序)

12 如果没有为对象指定初始化器,则该对象是默认初始化的。当获得具有自动或动态存储持续时间的对象的存储时,该对象具有一个不确定的值,如果没有对该对象执行初始化,该对象将保留一个不确定的值,直到该值被替换(8.18)。[ 注意:具有静态或线程存储持续时间的对象是零初始化的,参见 6.6.2。——尾注]

所以在全局命名空间中声明的数组具有静态存储时长和零初始化

而 main 中声明的数组具有自动存储持续时间并且其元素具有不确定的值。

请注意,可变长度数组不是标准的 C++ 功能。

int M = 1000;
int a[M];

或者

cin >> M;
int a[M];

那就是这两个程序都不符合标准。

此外,可变长度数组可能不会在声明中显式初始化。

一些编译器可以支持它们作为它们自己的语言扩展。

于 2020-02-17T18:17:48.460 回答