为什么我的数组的最后一行填充了随机数?

时间:2017-06-01 00:32:12

标签: c++ arrays for-loop

我试图制作一个填充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?

5 个答案:

答案 0 :(得分:4)

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迭代。

答案 1 :(得分:3)

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

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

enter image description here

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

答案 2 :(得分:2)

指数从0开始。所以你的循环应该从

改变

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

目前,您正在打印一个不属于您的阵列的其他行。

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

答案 3 :(得分:1)

该代码将您的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) ...

答案 4 :(得分:1)

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