C语言 应用程序在释放内存时出现分段错误



我有两个文件:

测试.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

相关内容

  • 没有找到相关文章

最新更新