0

私はこれらの2つのファイルを持っています:

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てコンパイルしています。

実行しようとすると、メモリを解放するときにセグメンテーション違反が発生します。ここで何が問題になっていますか?

4

5 に答える 5

3

node:を初期化する必要があります

vertex_node *node = NULL;

このように初期化しない場合は、次のことを確認してください。

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

最初の呼び出しで失敗し、この部分が実行されます。

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

の任意の値を使用しnodeます。この時点で、またはノードを解放しようとしたときに(運が悪ければ)、セグメンテーション違反が発生する可能性があります。

于 2012-08-14T15:27:26.330 に答える
3

スタック上の変数はゼロで初期化されません。次のことを試してください。

vertex_node *node = NULL;
于 2012-08-14T15:27:29.263 に答える
1

頂点ノードは明示的にNULLに設定する必要があります。発生するエラーは、mallocされていないメモリを解放したことが原因である可能性があります。

于 2012-08-14T15:29:24.877 に答える
0

*node自分自身がNULLにあることを確認する必要がありdty_vertexます。

于 2012-08-14T15:27:19.840 に答える
0

非ヒープメモリを解放しています。関数が終了すると、スタックメモリが解放されます。

于 2012-08-14T15:29:06.483 に答える