在下面的代码中,我创建了一个2D数组,tab。让len_a=5,len_b=4
在第一个for
循环之后,tab[0][5]
应该等于5,它就是。但是,当我打印行时,它将值更改为1.发生了什么?
int len_a=a.length(),len_b=b.length();
int tab[len_a+1][len_b+1];
tab[0][0]=0;
for(int i=1;i<=len_a;i++)//Init first row
tab[0][i]=i;
cout<<tab[0][5]<<endl;
for(int j=1;j<=len_b;j++)//Init first column
tab[j][0]=j;
for(int i=0;i<=len_a;i++)//Print row
cout<<tab[0][i]<<" | "<<i<<endl;
cout<<endl;
for(int i=0;i<=len_b;i++)
cout<<tab[i][0]<<" | "<<i<<endl;
输出:
5(第一次cout&lt;&lt;&lt; tab [0] [5])
0 | 0
1 | 1
2 | 2
3 | 3
4 | 4
1 | 5(第二个cout&lt;&lt; tab [0] [5] ???)
0 | 0
1 | 1
2 | 2
3 | 3
4 | 4
答案 0 :(得分:0)
C ++有0个索引数组,这意味着第一个元素是0,最后一个是N-1。
示例:
tab[2][3]; //creating array
tab[0][0]; //first element of array
tab[0][1];
tab[0][2]; //last element in the first row
tab[1][0];
tab[1][1];
tab[1][2]; //last element in the second row and last element in array
上面未提及的任何其他元素,如tab[2][...]
或tab[...][3]
都在声明的bounds数组之外。
由于在示例中创建了tab[6][5]
,cout << tab[0][5];
正在访问超出tab
范围的内容。由于@Bob__提到数组分配连续内存,因此访问tab[0][5]
实际上访问tab[1][0]
。 tab[1][0]
元素的第二次访问是在//Init first column
发生之后覆盖tab[1][0]
元素中的值。
顺便说一句: 在示例中,第一个支架交换为秒。应该有:
int tab[len_a][len_b];
for(int i=0; i<=len_a; i++)//Init first row
tab[i][0]=i; //not tab[0][i]