对于家庭作业,我们应该创建一个不再需要使用的有向图和空闲内存。现在,我似乎陷入困境的是增加顶点(我用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个测试就好了。
非常感谢任何见解。
答案 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)