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

在C语言中如何正确释放calloc分配的二维邻接矩阵内存?

问题根源

你的内存分配逻辑存在两处明显问题,直接导致了内存泄漏:

  • 嵌套了多余的内层j循环:每个adjacency_matrix[i]指针对应的一维数组仅需分配1次,你在j循环中给同一个i对应的指针重复执行了num_nodes次calloc,每次新分配的地址会覆盖上一次的地址,导致此前分配的内存块地址直接丢失、无法被释放。当num_nodes=7时,你总共执行了49次calloc,但释放逻辑仅释放了7个有效地址,剩下的42块内存就是valgrind报告的泄漏来源,和报错的1176字节完全匹配(42块 × 7个int/块 × 4字节/int = 1176字节)。
  • calloc参数顺序不规范:标准calloc的参数顺序为(元素个数, 单个元素大小),你写反了两个参数,虽然多数场景下运行结果不受影响,但属于不符合C标准的写法,极端场景下可能触发异常。
修复方案

仅需要调整内存分配代码,删除多余的内层循环,修正calloc参数顺序即可,原有内存释放逻辑无需修改:

Graph* new_graph = (Graph*)malloc(sizeof(Graph));
// 务必给num_vertices赋值,确保释放时能拿到正确的节点数
new_graph->num_vertices = num_nodes;
new_graph->adjacency_matrix = malloc(num_nodes * sizeof(int*));
for(int i = 0; i < num_nodes; i++) {
    new_graph->adjacency_matrix[i] = calloc(num_nodes, sizeof(int));
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 19:45:07