我写了一个这样的乘法表:
#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){
......
如果他们都给出相同的答案那么差异是什么?
答案 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 < 10
和j < 10
,因此最多可达9个。
答案 3 :(得分:1)
经验法则:在for
循环中,N
子句中的(i = 0; i < N; i++)
应该(几乎总是)等于相应数组的长度。当您看到i <= N
或i < 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<9
和j<9
,要么将数组大小增加到table[10][10]
。
希望这可能有所帮助。