当我使用二维数组时。我给了一个5 * 1矩阵的输入,结果是这样的。
#include<stdio.h>
int main(){
int rows=5,cols=1;
int arr[rows][cols];
for(int i=0;i<rows;i++){
for(int j=0;j<cols;j++){
scanf("%d",&arr[i][j]);
}
}
printf("%d\n",arr[1][1]);
printf("%d\n",arr[2][0]);
printf("%d\n",arr[0][2]);
return 0;
}
输入:1 2 3 4 5
输出:3 3 3
它如何工作?
答案 0 :(得分:2)
在摘要下方更改
printf("%d\n",arr[1][1]);
printf("%d\n",arr[2][0]);
printf("%d\n",arr[0][2]);
到以下一个:
printf("%d\n",arr[1][0]);
printf("%d\n",arr[2][0]);
printf("%d\n",arr[0][0]);
正如Yunnosch在评论中提到的那样,您正在尝试访问数组之外的内容并观察未定义的行为。
答案 1 :(得分:2)
使用(有效)
int arr[5][1];
您唯一可以有意义访问的数组成员是
arr[0][0]
arr[1][0]
arr[2][0]
arr[3][0]
arr[4][0]
您可能会很幸运地获得访问权限
arr[r][c]
c!= 0视为
arr[r+c]
但不能保证。
您可能故意将对所有人的访问权限设计为r + c == 2。
并且arr [2]的值为3。
答案 2 :(得分:2)
这里
int arr[rows][cols];
cols
的值为1
意味着在每个arr[rows]
中,由于数组索引从zero
开始,您只能存储一个元素。因此,arr[1][1]
根本不存在,只有arr[1][0]
存在。
在所有printf
语句中,您正在访问超出范围的数组元素,从而调用未定义的行为。
printf("%d\n",arr[1][1]);/* result is UB, it may prints some junk data */
答案 3 :(得分:2)
访问数组下标超出范围是undefined behavior。
arr
是一个维度为2D
的{{1}}数组。
这些声明
5x1
5x1数组的内存视图如下所示:
printf("%d\n",arr[1][1]); // UB --> accessing second row second column element
printf("%d\n",arr[2][0]); // Valid --> accessing third row first column elemnt
printf("%d\n",arr[0][2]); // UB --> accessing first row third column element
在arr 5x1
col 0
row 0 +----+
[0][0] | |
| |
row 1 +----+
[1][0] | |
| |
row 2 +----+
[2][0] | |
| |
row 3 +----+
[3][0] | |
| |
row 4 +----+
[4][0] | |
| |
+----+
数组中,行的有效值是从5x1
到0
,而列的唯一有效值是4
(因为在其中只有一列您的2D数组)。尝试访问0
和row
之外的任何值都将导致未定义的行为。