C++ 二维数组代码中的错误

C++ 二维数组代码中的错误,c++,arrays,timing,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);

我写了这样一个乘法表:

#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;
}
但当我将代码更改为以下内容时,它不会抛出该错误:

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

如果它们给出相同的答案,那么有什么区别???

您的数组溢出了,边界中的最大索引是8(因为索引是从零开始的,并且您定义了9个单元格作为维度大小,因此每个维度中的最后一个单元格是8),并且for循环可以达到9(包括9)这将导致溢出。

如果数组溢出,则边界中的最大索引为8(因为索引是从零开始的,并且您定义了9个单元格作为维度大小,因此8将是每个维度中的最后一个单元格),并且for循环可以达到9(包括9),这将导致溢出。

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


现在您实际上有了一个二维数组,但问题仍然是一样的。

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


现在您实际上有了一个二维数组,但问题仍然是一样的。

您将在
for
循环中超出数组。它们应该是:

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

数组索引从0到8运行,但您将上升到9,因为您的条件是
i<10
j<10

您将在
for
循环中超出数组。它们应该是:

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

数组索引从0到8运行,但您要升到9,因为您的条件是
i<10
j<10
经验法则:对于
循环,
N
in
(i=0;i
子句应该(几乎总是)等于对应数组的长度。当您看到
i规则:在
for
循环中,
中的
N
(i=0;i
子句应该(几乎总是)等于对应数组的长度。当您看到C/C++中的
i数组时,从0索引开始。
声明表[9][9]时,为索引为0..8、0..8的9x9数组保留内存
但是在for循环中,您的上索引是9-它超出了数组范围

我想你们应该像你们指出的那个样声明表格:

int table[10][10];

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

我想你们应该像你们指出的那个样声明表格:

int table[10][10];

您正在访问数组范围外的元素。 您的阵列是一个
9x9
表,但您正在尝试访问
10x10
表。
因此,要么使用
i访问数组范围外的元素。
您的阵列是一个
9x9
表,但您正在尝试访问
10x10
表。
因此,使用
i将我的代码与int table[9][9],i,j;的输出与int table[10][10]的代码相同,i,j;第一个只抛出一个错误,但我的代码与int table[9][9],i,j;的输出与int table[10][10]的代码相同,i,j;第一个只抛出一个错误,但我的代码与int table[9][9]的输出相同,i,j;给出的输出与具有int table[10][10]的代码相同,i,j;第一个代码只是抛出一个错误,这是因为访问溢出的单元格不一定会使程序崩溃,但会导致与您的情况相同的未定义行为,但具有int table[9][9]的代码给出的输出与具有int table的代码相同[10] [10],i,j;第一个只是抛出一个错误,这是因为访问溢出的单元格不一定会使您的程序崩溃,但会导致一个未定义的行为,就像在您的案例中一样,但是我使用int table[9][9]的代码,i,j;给出的输出与使用int table[10][10]的代码相同,i,j;如果使用数组越界,第一个会抛出一个错误,“未定义的行为”可能会出现这种情况,这是程序中未定义的行为之一。代码输出结果是正确的,因为C++没有数组外的检查,因此您可以访问超出界限值。但是您正在覆盖未被声明的内存,可能会被当作损坏的数据。您可以查看堆栈溢出问题来获取更多信息。:但是我的带有int table[9][9],i,j;的代码给出的输出与带有int table[10][10],i,j;的代码相同;第一个代码只是抛出一个错误如果您使用数组越界,“未定义的行为”可能会出现这种情况,这是程序中未定义的行为之一。代码输出结果是正确的,因为C++没有数组外的检查,因此您可以访问超出界限值。但是您正在覆盖未被声明的内存,可能会被当作损坏的数据。您可以查看堆栈溢出问题来获取更多信息。:但是我的带有int table[9][9]的代码,i,j;给出的输出与带有int table[10][10]的代码相同,i,j;第一个只是抛出一个error@aliKianfar它可能正在输出无效索引的值,但这些值未写入有效的内存位置,因此会导致未定义的行为。这些值可能看起来正确,但您仍在破坏堆栈,这将阻止后续代码正常运行,并导致难以调试问题(如果没有被运行时检查捕获,就像您的例子一样)。但是我的代码在int table[9][9]中,i,j;给出了相同的输出