【问题标题】:Why is my double array not initializing to 0?为什么我的双数组没有初始化为 0?
【发布时间】:2020-10-09 02:10:03
【问题描述】:

我正在创建一个二维数组。但是,当我使用双 for 循环检查二维数组的内容时,它会填充随机数。我知道我可以使用双 for 循环手动用 0 填充我的双数组。但是,我很困惑为什么它在初始化时不这样做。

int arr[5][5];
for (int i = 0; i < 5; i++) {
    for (int j = 0; j < 5; j++) {
        cout << arr[i][j]  << " ";
    }
    cout << endl;
}

输出:

0 0 0 0 0 
0 0 0 -272632592 32766 
-272632616 32766 0 1 0 
0 0 0 0 0 
0 0 0 0 -272632608 
Program ended with exit code: 0

【问题讨论】:

  • 您的“双循环”正在打印数组的元素,而不是初始化它们。 ints 的数组具有自动存储持续时间,因此未初始化。访问未初始化变量的值(或者,在您的情况下,未初始化的数组元素)会导致未定义的行为。

标签: c++ arrays vector initialization int


【解决方案1】:

在 C 和 C++ 中,POD(普通旧数据)类型的变量和此类类型的数组通常不会被初始化,除非您明确初始化它们。未初始化的值可以是任何东西,甚至可以与程序的一次运行不同。您必须自己初始化它们。

在某些情况下,POD 类型会自动初始化(例如,如果 arr 是全局的,则初始化为零),但即使在这些情况下,初始化 POD 类型通常也是一种好习惯。

您可以使用std::fill()std::fill_n() 来填充您的数组,这样可以避免编写双重for 循环。

相反,您可以使用std::vector&lt;int&gt; 来保存您的二维数组。这保证初始化数组中的值。您也可以考虑使用std::vector&lt;std::vector&lt;int&gt;&gt; 来强调数据的二维性质,但它可能不太方便。

【讨论】:

  • 不需要std::fill,使用初始化器即可。
  • 第一段的注意事项:在某些情况下是 POD 变量,例如,如果 arr 是全局的,are initialized for you
  • "未初始化的值可以是任何值,甚至可以从你的程序的一次运行到下一次不同。" - 甚至不要假设有一个价值。读取未初始化的内存是未定义的行为,因此您可以获得的不仅仅是随机值。开发人员假设未初始化的值只是“垃圾”,从而导致严重的安全漏洞。
  • 在二维数组上使用 std::fill 有点尴尬
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
相关资源
最近更新 更多