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

