列数超过3时出现Segmentation fault的C语言数组转置问题
数组转置代码段错误问题分析与修复
错误根源
你代码里的核心问题是在声明变长数组(VLA)时,使用了未初始化的变量r和c。
执行int arr1[r][c];这行代码时,r和c还没通过scanf获取用户输入,它们的值是栈内存里的随机垃圾数据。此时创建的数组大小完全不可控,当后续输入的列数c超过某个阈值(比如你遇到的3)时,数组访问就会越界,触发栈溢出,最终导致Segmentation fault错误。
修复方案
方案1:调整变量声明顺序(简单直接)
先通过scanf获取r和c的有效值,再声明变长数组:
#include<stdio.h> int main() { int i,j,r,c; // 先获取行数和列数 printf("Enter no. of rows in the array: "); scanf("%d",&r); printf("Enter no. of columns in the array: "); scanf("%d",&c); // 变量已初始化,再声明变长数组 int arr1[r][c]; printf("Enter elements in %dX%d array:\n",r,c); for ( i = 0; i < r; i++) { for ( j = 0; j < c; j++) { scanf("%d",&arr1[i][j]); } } printf("Your entered array is:\n"); for ( i = 0; i < r; i++) { for ( j = 0; j < c; j++) { printf("%d ",arr1[i][j]); } printf("\n"); } printf("Transpose of the array is:\n"); for ( i = 0; i < c; i++) { for ( j = 0; j < r; j++) { printf("%d ",arr1[j][i]); } printf("\n"); } return 0; }
方案2:使用动态内存分配(适合大数组)
如果数组规模较大,栈空间可能不足,推荐用malloc在堆上分配内存:
#include<stdio.h> #include<stdlib.h> int main() { int i,j,r,c; printf("Enter no. of rows in the array: "); scanf("%d",&r); printf("Enter no. of columns in the array: "); scanf("%d",&c); // 动态分配二维数组 int **arr1 = (int **)malloc(r * sizeof(int *)); for(i=0; i<r; i++){ arr1[i] = (int *)malloc(c * sizeof(int)); } printf("Enter elements in %dX%d array:\n",r,c); for ( i = 0; i < r; i++) { for ( j = 0; j < c; j++) { scanf("%d",&arr1[i][j]); } } printf("Your entered array is:\n"); for ( i = 0; i < r; i++) { for ( j = 0; j < c; j++) { printf("%d ",arr1[i][j]); } printf("\n"); } printf("Transpose of the array is:\n"); for ( i = 0; i < c; i++) { for ( j = 0; j < r; j++) { printf("%d ",arr1[j][i]); } printf("\n"); } // 释放动态分配的内存 for(i=0; i<r; i++){ free(arr1[i]); } free(arr1); return 0; }
补充说明
之前列数≤3时程序能正常运行是巧合——栈上的垃圾值刚好让数组大小足够容纳输入的数据,一旦列数超过这个随机阈值,就会触发数组访问越界,导致段错误。
内容的提问来源于stack exchange,提问作者Raunak Raj
相关产品推荐
相关产品推荐

