访问结构成员时出现分段错误

Mat*_*hew 1 c linked-list segmentation-fault

我一直在学习 C,但在使用链表时遇到了问题。当循环指向链表的指针时,我遇到了分段错误,但我不确定为什么。

查看类似问题的建议是分配内存,但我发现这个答案令人困惑。链表是否必须使用堆内存,如果是,为什么?

这是我的代码:

#include <stdio.h>

typedef struct Node {
  char *name;
  struct Node *next;
} Node;

typedef struct Thing {
  Node *node;
} Thing;

Thing make_thing()
{
  Thing t = {
    .node = NULL
  };
  return t;
}

Thing * add_node(Thing *t, char *name)
{
  Node node = {
    .name = name,
    .next = t->node
  };

  t->node = &node;

  return t;
}

void print_nodes(Thing *t)
{
  Node *n = t->node;

  while(n != NULL) {
    printf("Node: %s\n", n->name);
    n = n->next;
  }
}

int main()
{
  printf("Start\n");

  Thing t = make_thing();
  add_node(&t, "one");

  printf("First %s\n", t.node->name);

  print_nodes(&t);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

Ctx*_*Ctx 7

您正在使用自动存储超出其范围的对象:

Node node = {
  .name = name,
  .next = t->node
};

t->node = &node;

return t;
Run Code Online (Sandbox Code Playgroud)

在这里,您&node将返回后无效(超出范围)的指针泄漏给调用者并在此处使用它:

 printf("First %s\n", t.node->name);
Run Code Online (Sandbox Code Playgroud)

您必须通过malloc()用于您的Node结构来分配内存。

例子:

 Node *node = malloc(sizeof *node);
 node->name = name;
 node->next = t->node;
 t->node = node;

 return t;
Run Code Online (Sandbox Code Playgroud)

当不再使用内存时,您必须关心释放内存以防止内存泄漏。