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

C语言二维动态数组无法打印内容,求行列式计算程序问题排查

二维动态数组实现问题的修复方案

我帮你揪出代码里的核心问题啦!你的程序能编译但没法输出内容,根源是二维动态数组的内存分配步骤完全错了,导致访问了非法内存空间,触发了未定义行为(比如程序悄悄崩溃或者输出乱码)。咱们一步步拆解问题和修复方法:

核心问题1:顶层内存分配的类型错误

你写的这行代码:

arDet = (int**)malloc(sizeof(int)*size);

arDet是int**类型(指向int指针的指针),所以每个元素应该是int*的大小,不是int的大小。正确的写法应该是:

arDet = malloc(sizeof(int*) * size);

(注:C语言里不需要强制转换malloc的返回值,不过如果习惯加也没问题,关键是类型要匹配)

核心问题2:缺少每行的内存分配

你只给顶层的指针数组分配了空间,但每个arDet[i]还是野指针,没有指向实际存储int数据的数组空间。所以必须在第一个for循环里,给每一行单独分配内存:

for(i = 0 ; i < size; i++) {
    // 先给第i行分配size个int的存储空间
    arDet[i] = malloc(sizeof(int) * size);
    for(j = 0 ; j < size; j++) {
        scanf("%d", &arDet[i][j]);
    }
}

额外的优化建议(非致命但能让代码更健壮)

  • 尽量避免全局变量:你把size、i、j这些变量都设成全局的,容易引发意外的变量值覆盖问题,改成局部变量更安全。
  • 修复函数返回值问题:input()声明的返回类型是int,但函数里没有return语句,这会导致未定义行为,建议改成void input()或者返回一个状态码。
  • 修正3阶行列式的计算逻辑:你注释里用了一维数组的索引(比如arDet[4]),但arDet是二维数组,应该用arDet[1][1]这种二维索引形式。
  • 记得释放内存:动态分配的内存不用了要手动释放,避免内存泄漏。

修复后的完整代码

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

// 把size和arDet通过指针传递,避免全局变量
void input(int *size, int ***arDet) {
    do {
        scanf("%d", size);
    } while(*size > 3 || *size < 2);
    
    // 分配顶层指针数组,增加malloc失败检查
    *arDet = malloc(sizeof(int*) * *size);
    if(*arDet == NULL) {
        perror("malloc failed");
        exit(EXIT_FAILURE);
    }
    
    for(int i = 0 ; i < *size; i++) {
        // 分配每行的int数组,增加失败检查
        (*arDet)[i] = malloc(sizeof(int) * *size);
        if((*arDet)[i] == NULL) {
            perror("malloc failed");
            exit(EXIT_FAILURE);
        }
        for(int j = 0 ; j < *size; j++) {
            scanf("%d", &(*arDet)[i][j]);
        }
    }
}

int main() {
    int size;
    int **arDet = NULL;
    
    input(&size, &arDet);
    
    if(size == 2) {
        int det = arDet[0][0]*arDet[1][1] - arDet[0][1]*arDet[1][0];
        printf("%d\n", det);
    } else if(size == 3) {
        // 修正3阶行列式的计算逻辑
        int det = arDet[0][0]*(arDet[1][1]*arDet[2][2] - arDet[1][2]*arDet[2][1]) 
                - arDet[0][1]*(arDet[1][0]*arDet[2][2] - arDet[1][2]*arDet[2][0]) 
                + arDet[0][2]*(arDet[1][0]*arDet[2][1] - arDet[1][1]*arDet[2][0]);
        printf("%d\n", det);
    } else {
        fprintf(stderr, "Invalid size\n");
        return -1;
    }
    
    // 释放动态分配的内存
    for(int i = 0; i < size; i++) {
        free(arDet[i]);
    }
    free(arDet);
    
    return 0;
}

现在你运行这个代码,输入2或3阶矩阵的大小和元素,就能正常输出行列式结果啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 17:53:12