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;给出了相同的输出