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

C语言图邻接矩阵realloc扩容触发Trace/breakpoint trap异常求助

问题排查结论

核心错误原因

  • 你在add_vertex函数中先将gptr->size自增1,再对二级指针gptr->matrix做扩容,扩容后新增的最后一个一级指针(gptr->matrix[gptr->size - 1])是未初始化的野指针,后续循环遍历所有gptr->size个一级指针调用realloc时,把野指针传给了realloc,触发了未定义行为。
  • 未定义行为的表现就是跨环境运行结果不一致:clang、gcc7.4环境下可能刚好新分配的内存块默认是0值,realloc遇到空指针会等价于malloc,所以没有报错;而gcc8.1的内存分配实现会保留脏数据,野指针指向非法地址,realloc直接触发内存访问异常。

修复方案

调整realloc逻辑,先保存扩容前的矩阵大小,只对原有有效行做扩容,新增的行单独分配内存即可:

void add_vertex(graph *gptr, unsigned vertex)
{
    for (unsigned i = 1; i < gptr->size; i++)
        if (gptr->matrix[i][0] == vertex) return;
    
    unsigned old_size = gptr->size; // 先存储扩容前的大小
    gptr->size++;
    gptr->matrix = realloc(gptr->matrix, gptr->size * sizeof(*gptr->matrix));
    // 仅对原本就存在的old_size行做重分配
    for (unsigned i = 0; i < old_size; i++)
        gptr->matrix[i] = realloc(gptr->matrix[i], gptr->size * sizeof(**gptr->matrix));
    // 新增的行单独分配内存,避免操作野指针
    gptr->matrix[old_size] = malloc(gptr->size * sizeof(**gptr->matrix));
    
    gptr->matrix[gptr->size - 1][0] = gptr->matrix[0][gptr->size - 1] = vertex;
    for (unsigned i = 1; i < gptr->size; i++)
        gptr->matrix[gptr->size - 1][i] = gptr->matrix[i][gptr->size - 1] = -1;
}

额外优化建议

  • 所有malloc、realloc调用后都建议检查返回值是否为空,避免内存分配失败导致的后续访问异常。
  • 程序退出前记得遍历释放所有申请的堆内存,避免内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 06:54:03