簡體   English   中英

訪問結構成員時出現分段錯誤

[英]Segmentation fault accessing struct member

我一直在學習 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;
}

您正在使用自動存儲超出其范圍的對象:

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

t->node = &node;

return t;

在這里,您將返回后無效(超出范圍)的指針&node泄漏給調用者並在此處使用它:

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

您必須使用malloc()為您的Node結構分配內存。

例子:

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

 return t;

當不再使用內存時,您必須關心釋放內存以防止內存泄漏。

暫無
暫無

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

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