c中2d数组的5 * 1矩阵

时间:2018-06-23 11:18:39

标签: c arrays

当我使用二维数组时。我给了一个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

它如何工作?

4 个答案:

答案 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] | | | | +----+ 数组中,行的有效值是从5x10,而列的唯一有效值是4(因为在其中只有一列您的2D数组)。尝试访问0row之外的任何值都将导致未定义的行为。