while循环中的分段错误

时间:2015-11-22 06:53:10

标签: c segmentation-fault

对于家庭作业,我们应该创建一个不再需要使用的有向图和空闲内存。现在,我似乎陷入困境的是增加顶点(我用GDB验证)。但令我感到不安的是,这个问题只发生在我必须通过的一半测试中,我真的不太确定为什么它不会发生在所有测试上

主要功能(测试):

int main(){
Graph graph;
const char *vertices_to_add[] = {"koala", "platypus", "snake", "salamander",
                                    "gecko", "frog", "dog", "hedgehog"};
int i;

for(i = 0; i < sizeof(vertices_to_add) / sizeof(vertices_to_add[0]); i++)
    add_vertex(&graph, vertices_to_add[i]);

clear_graph(&graph); /* works fine, from other methods passing */

return 0;

然后是add_vertex

int add_vertex(Graph *graph, const char new_vertex[]){
Vertex *curr, *prev, *new_vert;

    if(graph == NULL)
        return 0;
    if (new_vertex == NULL)
        return 0;
    if (has_vertex(*graph, new_vertex) == 1)
        return 0;

    new_vert = malloc(sizeof(*curr));
    new_vert->name = malloc(strlen(new_vertex) * sizeof(char *));
    new_vert->name = strcpy(new_vert->name, new_vertex);

    if (graph->head == NULL){
        /* head case */
        graph->head = new_vert;
        return 1;
    }

    else{
        /* head != NULL */
        curr = graph->head;

        while (curr != NULL){
            prev = curr;
            curr = curr->next_vert;
        }

        prev->next_vert = new_vert;
        return 1;
    }
    return 0;
}

has_vertex方法调用:

int has_vertex(Graph graph, const char name[]){
Vertex *vertex;

if (graph.head == NULL)
    return 0;
if (name == NULL)
    return 0;

vertex = graph.head;

while (vertex != NULL){
    if (strcmp(vertex->name, name) == 0)
        return 1;
    else
        vertex = vertex->next_vert;
}
return 0;
}

我遇到的段错误似乎源于has_vertex中的while循环,但我使用GDB并不太好,所以我可能错了。我真的很难说这是在我有的5/10测试中发生的,但是在另外5个测试就好了。

非常感谢任何见解。

1 个答案:

答案 0 :(得分:2)

add_vertex函数中,您忘记了指向下一个顶点的指针:

new_vert->next_vert = NULL;

也是这一行:

new_vert->name = malloc(strlen(new_vertex) * sizeof(char *));

分配的内存超过了必要的内容,应该是(strlen(new_vertex) + 1 /* terminator */) * sizeof(char)