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

C语言矩阵操作程序输入中途崩溃,遇segmentation fault求助

C矩阵程序输入阶段Segmentation Fault问题解决

问题回顾

我是C编程和指针的新手,编写了一个可接收矩阵并执行各类用户指令的程序,但运行时输入过程会中途崩溃,部分编译器提示segmentation fault (core dumped),自行调试数小时未定位问题。

原程序代码

#include <stdio.h>
#include <stdlib.h>

int main() {
    int rows, cols;
    int **matrix;
    printf("输入矩阵行数和列数:");
    scanf("%d %d", &rows, &cols);
    
    // 错误:使用sizeof(int)而非sizeof(int *)
    matrix = (int **)malloc(rows * sizeof(int));
    for (int i = 0; i < rows; i++) {
        matrix[i] = (int *)malloc(cols * sizeof(int));
    }
    
    printf("输入矩阵元素:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            scanf("%d", &matrix[i][j]);
        }
    }
    
    // 省略其他操作代码
    
    // 释放内存
    for (int i = 0; i < rows; i++) {
        free(matrix[i]);
    }
    free(matrix);
    return 0;
}

示例输入

3 3
1 2 3
4 5 6
7 8 9

问题定位

核心错误在于二维矩阵内存分配时的类型不匹配:分配行指针数组时,使用了sizeof(int)而非sizeof(int *)。在多数64位系统中,int大小为4字节,int *大小为8字节,这导致行指针数组的内存分配不足,访问时越界触发Segmentation Fault。此外,原代码未添加内存分配失败的错误处理,极端情况下也可能引发异常。

修正后的最终代码

#include <stdio.h>
#include <stdlib.h>

int main() {
    int rows, cols;
    int **matrix;
    
    printf("输入矩阵行数和列数:");
    if (scanf("%d %d", &rows, &cols) != 2) {
        printf("输入格式错误\n");
        return 1;
    }
    
    // 正确分配行指针数组:使用sizeof(int *)
    matrix = (int **)malloc(rows * sizeof(int *));
    if (matrix == NULL) {
        perror("分配行指针内存失败");
        return 1;
    }
    
    // 分配每行的元素内存
    for (int i = 0; i < rows; i++) {
        matrix[i] = (int *)malloc(cols * sizeof(int));
        if (matrix[i] == NULL) {
            perror("分配列元素内存失败");
            // 释放已分配的内存,避免泄漏
            for (int j = 0; j < i; j++) {
                free(matrix[j]);
            }
            free(matrix);
            return 1;
        }
    }
    
    printf("输入矩阵元素:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            if (scanf("%d", &matrix[i][j]) != 1) {
                printf("元素输入错误\n");
                // 清理内存
                for (int k = 0; k < rows; k++) {
                    free(matrix[k]);
                }
                free(matrix);
                return 1;
            }
        }
    }
    
    // 示例操作:打印矩阵
    printf("你输入的矩阵为:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
    
    // 释放所有内存
    for (int i = 0; i < rows; i++) {
        free(matrix[i]);
    }
    free(matrix);
    return 0;
}

关键修正说明

  1. 内存分配类型修正:将rows * sizeof(int)改为rows * sizeof(int *),确保行指针数组有足够内存存储每个行地址。
  2. 添加错误处理:
    • 检查scanf的返回值,确保输入格式合法
    • 检查malloc的返回值,避免空指针访问
    • 内存分配失败时,释放已分配的内存,防止内存泄漏
  3. 边界合法性保证:所有数组访问均在已分配的内存范围内,避免越界访问。

内容的提问来源于stack exchange,提问作者Sana Niroomand

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 15:25:54