【问题标题】:Why is the last row of my array filled with random numbers?为什么我的数组的最后一行充满了随机数?
【发布时间】:2017-06-01 00:32:12
【问题描述】:

我正在尝试制作一个用 0 填充的 10x10 数组,然后打印它,但最后一行没有用 0 填充。

#include <iostream>

using namespace std;

int main()
{

int table[9][9];
int height = 9;
int width = 9;

for(int i=0; i<=width; i++){
    for(int j=0; j<=height; j++){
        table[i][j] = 0;
    }
}

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

为什么这会让我的最后一行出现:

0 9 2 9 10 9 4201024 6422336 6422420 4199045

而不是 0 像其余的行?

【问题讨论】:

  • 你要打印多少行?
  • 您不应该遍历无效索引。 8 是最后一个索引而不是 9
  • 你的 for 循环比你在表中分配的索引多了一个索引。 &lt;= 只能是 &lt;

标签: c++ arrays for-loop


【解决方案1】:

C++ 中的数组从 0 开始索引。这意味着如果您有一个大小为 9 的数组,它包含索引 0-8。如果你检查索引 arr[9],你会得到未定义的行为。 C++ 中任何数组的最后一个索引是它的大小减 1。在你的循环中,你知道索引等于数组的大小。这是未定义的行为。有时你可能会得到一个段错误,有时你会得到一个数字,但它从来没有被定义过。如果您将循环更改为:

for(int i = 0; i<9; i++) 

代替:

for(int i = 0; i<=9; i++)

那么您将不会看到这种行为。如果您想创建一个 10x10 数组,请将您的数组声明更改为:

int table[10][10];

并更改您的 for 循环以从 0 迭代到 9。

【讨论】:

  • @FabioTurati 你说得对,我更新了我的答案。谢谢!
【解决方案2】:

您的数组大小为 10,这意味着您的索引范围是从 0 到 9。您正在尝试访问超出范围的索引 10 处的数组元素。这就是正在发生的事情。

当为数组分配存储空间时,元素的内存位置是连续的,这意味着它们在 RAM 中彼此相邻。当您尝试访问具有不在数组边界内的索引的数组元素时,您将获得当时在 RAM 的特定位置中发生的任何内容,可能是任何内容。

参考上图,如果你的数组要存储4个元素,你的索引范围将从03。因此,如果您尝试访问索引 4 处的元素,您将获得一个随机值。

【讨论】:

    【解决方案3】:

    索引从 0 开始。所以你的循环应该从

    for(int i=0; i&lt;=width; i++)for(int i=0; i&lt;width; i++)

    当前,您正在打印不属于您的数组的另一行。

    它看起来是随机值的原因是因为它实际上是打印出存储在该位置的内存中的内容,这可能是从代码到实际数据的任何内容。

    【讨论】:

      【解决方案4】:

      代码将您的 10x10 数组定义为 9x9 数组。将其视为 10x10 数组会产生一堆我们的越界访问。 int table[10][10] 会更好。通常,对尺寸使用清单常量:

      const int height = 10;
      const int width = 10;
      int table[height][width];
      for (int i = 0; i < height; ++i) ...
      

      【讨论】:

        【解决方案5】:

        您正在创建的数组大小为 9x9。因此,当您打印 9x9 数组的第 10 行时,它会打印垃圾值,因为第 10 行不存在。因此,为了创建 10x10 数组,请按以下方式声明它int array[10][10]

        【讨论】:

          猜你喜欢
          • 2016-02-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-08
          • 2020-01-19
          • 2013-04-18
          • 1970-01-01
          相关资源
          最近更新 更多