我有两个文件:
测试.h
#ifndef TEST_H
#define TEST_H
typedef struct _vertex_node
{
double x;
double y;
struct _vertex_node *next;
} vertex_node;
static void add_vertex(vertex_node **node, const double x, const double y);
static void dty_vertex(vertex_node **node);
#endif // TEST_H
测试.c
#include <stdio.h>
#include <stdlib.h>
#include "test.h"
static void add_vertex(vertex_node **node, const double x, const double y)
{
if(NULL == (*node))
{
(*node) = malloc(sizeof(vertex_node));
(*node)->x = x;
(*node)->y = y;
(*node)->next = NULL;
}
else
add_vertex(&((*node)->next), x, y);
}
static void dty_vertex(vertex_node **node)
{
if(NULL != (*node)->next)
dty_vertex(&((*node)->next));
free(*node);
}
int main(int argc, char **argv)
{
vertex_node *node;
vertex_node *iterator;
add_vertex(&node, 0, 0);
add_vertex(&node, 1, 0);
add_vertex(&node, 1, 1);
add_vertex(&node, 0, 1);
iterator = node;
while(NULL != iterator)
{
printf("x: %f, y: %fn", iterator->x, iterator->y);
iterator = iterator->next;
}
dty_vertex(&node);
return 0;
}
我正在使用gcc -Wall -ggdb test.c -o test
命令来编译它。
当我尝试运行它时,它在释放内存时给我一个分段错误,这里有什么问题?
你需要初始化node
:
vertex_node *node = NULL;
如果不像这样初始化,请检查:
if(NULL == (*node))
{ /* */ }
第一次调用将失败,并执行此部分:
add_vertex(&((*node)->next), x, y);
在 node
中具有任意值。此时,或者当您尝试释放节点时(如果您不走运的话),您可能会遇到赛段错误。
堆栈上的变量未初始化为零。请尝试以下操作:
vertex_node *node = NULL;
顶点节点应显式设置为 NULL。您得到的错误可能是由于释放了未正确分配的内存。
您正在释放非堆内存。当函数退出时,堆栈内存将被释放。
您必须检查*node
本身是否NULL
dty_vertex
。