链表C中的分段错误(核心转储)

时间:2014-03-14 17:12:38

标签: c linked-list segmentation-fault

我在这段带有链表的代码中遇到了问题。它给了我错误:

 Segmentation Fault (Core Dumped)

任何人都可以看到似乎是什么问题吗?提前谢谢。

pos代表位置,root代表第一个元素

typedef struct
{
  element *root;
  int size;
} list;

typedef struct _element
{
  char *str;
  struct _element *next;
} element;

int
insert_list (list * lst, const char *value, int pos)
{
  element *new;

  int k;
  new = malloc (sizeof (element));

  for (k = 0; k < pos; k++)
    {
      new = lst->root;
      lst->root = lst->root->next;

      if (k == pos - 1)
        {
          lst->root = NULL;
          new->str = value;
        }
    }

  for (k = 0; k <= lst->size; k++)
    {
      new = lst->root;
      lst->root = lst->root->next;

      if (k == lst->size)
        {
          lst->root = NULL;
          new->str = value;
        }
      if (pos < 0 || pos >= lst->size)
        return -1;
      else
        return pos;
    }
}

1 个答案:

答案 0 :(得分:1)

让我们看看如何调试它。

首先,使用警告编译代码,并阅读警告:

$ gcc -Wall x.c -o xx.c:6:3: error: unknown type name ‘element’
x.c: In function ‘insert_list’:
x.c:26:11: warning: assignment from incompatible pointer type [enabled by default]
x.c:27:28: error: request for member ‘next’ in something not a structure or union
x.c:32:20: warning: assignment discards ‘const’ qualifier from pointer target type [enabled by default]
x.c:38:11: warning: assignment from incompatible pointer type [enabled by default]
x.c:39:28: error: request for member ‘next’ in something not a structure or union
x.c:44:20: warning: assignment discards ‘const’ qualifier from pointer target type [enabled by default]
x.c:51:1: warning: control reaches end of non-void function [-Wreturn-type]

所有这些都是问题,2(错误)表示您发布的代码从未编译过

因此,除了分段错误之外,您还有问题。第一个是这一行:

 lst->root = lst->root->next;

这是因为您需要在element struct之前定义list struct

除此之外,您的插入例程已被破坏:

new = malloc (sizeof (element));

for (k = 0; k < pos; k++)
  {
    new = lst->root;

在这里,您将多次覆盖新分配的element

在下一行,您将覆盖root

  lst->root = lst->root->next;

我担心我甚至无法弄明白你尝试在这里做什么。如果目标是在单个链接列表中的 pos 位置插入元素,那么您要做的是:

  1. 分配新元素n

  2. 如果pos为零,请将新元素n设为根,并使n->next指向当前根,然后就完成了。

    < / LI>
  3. 否则在列表中重复pos-1次,称之为x

  4. 制作n->next->next = x->next(如果n->next存在)

  5. 制作n->next = x