我有这两个文件:
test.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
test.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: %f\n", iterator->x, iterator->y);
iterator = iterator->next;
}
dty_vertex(&node);
return 0;
}
我使用gcc -Wall -ggdb test.c -o test
命令编译它。
当我尝试运行它时,它在释放内存时会给我一个分段错误,这里有什么问题?
答案 0 :(得分:3)
您需要初始化node
:
vertex_node *node = NULL;
如果你没有像这样初始化,请检查:
if(NULL == (*node))
{ /* */ }
第一次调用将失败并执行此部分:
add_vertex(&((*node)->next), x, y);
node
中的任意值。您可以在此时获取seg-fault,或者当您尝试释放节点时(如果您不幸)。
答案 1 :(得分:3)
堆栈上的变量不是零初始化的。请尝试以下方法:
vertex_node *node = NULL;
答案 2 :(得分:1)
顶点节点应明确设置为NULL。你得到的错误可能是由于释放了非商业化的内存。
答案 3 :(得分:0)
您必须在*node
中检查NULL
本身是dty_vertex
。
答案 4 :(得分:0)
你释放非堆内存。函数退出时释放堆栈内存。