二维数组代码中的错误

时间:2014-04-03 10:40:54

标签: c++ arrays timing

我写了一个这样的乘法表:

#include <iostream>
#include <conio.h>
using namespace std;
int main(){
    int table[9][9], i, j;
    for (i = 0; i < 10; ++i){
        for (j = 0; j < 10; ++j)
        {
            table[i][j] = (i + 1) * (j + 1);
            cout << table[i][j] << "\t";
        }
        cout << endl;
    }
    _getch();
    return 0;
}

当我运行它时,它给了我正确的答案但是当我按下一个键时它会抛出这个错误:

 run time check faliure #2-stack around the variable table was corrupted

但是当我将代码改为此时,它并没有抛出该错误:

......
int main(){
    **int table[10][10]**, i, j;
    for (i = 0; i < 10; ++i){
......

如果他们都给出相同的答案那么差异是什么?

6 个答案:

答案 0 :(得分:1)

你的数组溢出,边界中的最大索引是8(因为索引是基于零的,你定义了9个单元作为你的尺寸大小,因此8将是每个维度中的最后一个单元格)你的for循环可以达到9(包括9)会导致溢出。

答案 1 :(得分:1)

代码段int table[9]声明一个大小为9的数组,这意味着有效索引实际上是0-8。但是你的循环从0迭代到9.这会导致写入无效的内存区域(它不属于你的数组),从而破坏你的堆栈。

现在你实际上有一个二维数组,但问题仍然存在。

答案 2 :(得分:1)

您已经在for循环中走出数组。他们应该是:

for (i = 0; i < 9; ++i){
    for (j = 0; j < 9; ++j)

数组索引从0到8运行,但由于条件为i < 10j < 10,因此最多可达9个。

答案 3 :(得分:1)

经验法则:在for循环中,N子句中的(i = 0; i < N; i++)应该(几乎总是)等于相应数组的长度。当您看到i <= Ni < N + 1时,它(通常)是可怕的一对一错误的标志。

答案 4 :(得分:1)

C / C ++中的数组以0索引开头。 声明表[9] [9]时,为索引为0..8,0..8的9x9数组保留内存 但在for循环中,你的上层索引是9 - 它超出了数组范围

我猜你应该像你指出的那样声明表格:

int table[10][10];

答案 5 :(得分:1)

您正在访问数组的范围元素。 您的数组是9x9表,但您正在尝试访问10x10表。 因此,要么在两个循环中使用i<9j<9,要么将数组大小增加到table[10][10]。 希望这可能有所帮助。