簡體   English   中英

應用在釋放內存時出現分段錯誤

[英]App gives segmentation fault while freeing memory

我有這兩個文件:

測試

#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

測試

#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命令進行編譯。

當我嘗試運行它時,釋放內存時出現段錯誤,這是怎么回事?

您需要初始化node

vertex_node *node = NULL;

如果不這樣初始化,請檢查:

if(NULL == (*node))
  { /* */ }

第一次調用將失敗,並且將執行以下部分:

add_vertex(&((*node)->next), x, y);

node具有任意值。 此時,或者嘗試釋放節點時(如果不走運),您可能會遇到段錯誤。

堆棧上的變量未初始化為零。 請嘗試以下操作:

vertex_node *node = NULL;

頂點節點應顯式設置為NULL。 您得到的錯誤可能是由於釋放了未分配的內存。

您必須在dty_vertex檢查*node本身是否為NULL

您正在釋放非堆內存。 該函數退出時,將釋放堆棧內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM