`gdb`为`ret`和自然返回提供不同的结果

时间:2013-12-13 10:11:57

标签: c arrays memory gdb segmentation-fault

我有以下功能:

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

有关为什么手动“n退出”手动返回值与强制退货之间存在差异的原因的任何建议?

1 个答案:

答案 0 :(得分:0)

在函数中,如果你保证es的值是正确的,那么在调用之后,new的值应该是正确的。

也许,我想,

First, check the es;
Then, compare the return value of new with es.