#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列的数组

  1. 内存越界后果:↓后续的循环操作实际上在访问非法内存区域↓所有数组操作都会覆盖同一块内存地址
  2. 核心错误点:int arr[a][b]; // 声明在scanf之前↓a和b此时为0,创建的是0×0数组
  3. 核心错误点: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;
}