【发布时间】:2013-12-13 10:11:56
【问题描述】:
我有以下功能:
edge** graph_out_edges(graph* g, int src) {
int i;
int num_edges = 0;
edge** es = (edge**) malloc(sizeof(edge*) * g->num_edges);
for (i = 0; i < g->num_edges; i++) {
if (src == g->edges[i]->src) {
es[num_edges++] = g->edges[i];
}
}
es[num_edges] = NULL;
return es;
}
我使用b graph_out_edges 向函数添加断点,使用r 运行程序,然后继续(c) 两次(如果我再次继续,则会出现段错误)。然后我通过函数n 直到它在调用函数之后移动到命令
edge** new = graph_out_edges(g, min->dest);
p new[0] 和 p new[1] 提供有效边(成员已填充),p new[2] 提供0x0,正如预期的那样。然后我输入r重新启动程序,再次继续两次,但这次我输入ret(确认我想返回),输入n执行分配,但现在当我输入p new[0]我得到
Cannot access memory at address 0x2
(为了清楚起见,p new 现在说$10 = (edge**) 0x2)
关于为什么手动通过函数“nexting”和强制返回时返回值之间存在这种差异的任何建议?
【问题讨论】:
-
你没有在 malloc 之后检查
es的值。确保 malloc 不返回 NULL。 -
Please don't cast the return value of
malloc()in C。此外,如果所有传入的边都匹配,则循环将以num_edges == g->num_edges结束,NULL的最终标记写入将溢出缓冲区。危险!
标签: c arrays memory gdb segmentation-fault