#include <stdio.h> int main() { int a, b = 0; scanf("%d %d",&a,&b); int arr[a][b];//注意a、b的赋值一定要放在二维数组初始化之前,不妨可自行尝试 for (int i = 0;i < a;i++) { for (int j = 0;j < b;j++) { scanf("%d",&arr[i][j]); } }//二维数组的初始化 for (int i = 0; i < b;i++) { for (int j = 0;j < a;j++) { printf("%d ",arr[j][i]); } printf("\n"); } return 0; }
这个题我刚开始如下所写:发现运行不过去,一直重复输出一个数字,我就纳闷了!最后发现了,应该是a、b默认初始值是0,创建了一个0行0列的数组
- 内存越界后果:↓后续的循环操作实际上在访问非法内存区域↓所有数组操作都会覆盖同一块内存地址
- 核心错误点:int arr[a][b]; // 声明在scanf之前↓a和b此时为0,创建的是0×0数组
- 核心错误点:int arr[a][b]; // 声明在scanf之前↓a和b此时为0,创建的是0×0数组
#include <stdio.h> int main() { int a, b = 0; int arr[a][b];//注意a、b的赋值一定要放在二维数组初始化之前,不妨可自行尝试 scanf("%d %d",&a,&b); for (int i = 0;i < a;i++) { for (int j = 0;j < b;j++) { scanf("%d",&arr[i][j]); } }//二维数组的初始化 for (int i = 0; i < b;i++) { for (int j = 0;j < a;j++) { printf("%d ",arr[j][i]); } printf("\n"); } return 0; }