You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

列数超过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 00:06:30