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
相关产品推荐
相关产品推荐

