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

C语言矩阵次对角线上方元素求和程序扣分原因咨询

矩阵次对角线求和程序得分异常分析

核心问题:内存泄漏导致扣分

你的程序计算次对角线上方元素和的功能逻辑是正确的,但内存管理存在两处关键问题,如果评分标准中内存正确性占比50%,会直接导致扣一半分数:

1. MATRIX结构体本身未释放

在allocation函数中,你通过malloc分配了MATRIX结构体的堆内存,但free_memory函数只释放了矩阵的二维数组部分(M->mat的行指针和M->mat本身),没有释放M指向的结构体内存。正确的free_memory需要补充结构体释放逻辑:

MATRIX* free_memory(MATRIX* M) {
    int i;
    for(i = 0; i < M->n; i++){
        free(M->mat[i]);
    }
    free(M->mat);
    free(M); // 新增:释放MATRIX结构体本身
    return NULL;
}

2. 内存分配失败时的泄漏风险

allocation函数中,如果某一行的malloc失败,会直接返回NULL,但之前已经成功分配的行没有被释放,造成内存泄漏。修正后的分配失败处理逻辑如下:

MATRIX* allocation(int n)
{
    int i;
    MATRIX* M = (MATRIX*)malloc(sizeof(MATRIX));
    if(M == NULL){
        printf("Error during allocation of matrix struct");
        return NULL;
    }
    M->n = n;
    
    M->mat = (int**)malloc(sizeof(int*)*n);
    if(M->mat == NULL){
        printf("Error during allocation of rows");
        free(M); // 提前释放结构体
        return NULL;
    }
    
    for(i=0; i<n; i++)
    {
        M->mat[i] = (int*)malloc(sizeof(int)*n);
        if(M->mat[i] == NULL){
            printf("Error during allocation of columns");
            // 释放已分配的所有行
            for(int k=0; k<i; k++){
                free(M->mat[k]);
            }
            free(M->mat);
            free(M); // 释放结构体
            return NULL;
        }
    }
    return M;
}

次要可能:输出格式不匹配

你的main函数中,结果输出未添加换行:

printf("%d", sum_above_diagonal(M));

如果评分系统要求输出结果后必须换行(比如预期输出为X\n而非X),格式不匹配也可能导致部分扣分,但结合你通过所有测试用例的情况,这个可能性低于内存泄漏问题。

结论

最可能的原因是内存泄漏未被处理,导致内存管理部分的分数全扣,最终只拿到功能实现部分的一半分数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 23:12:10