为什么在尝试访问结构成员时会出现段错误?

Why do I get a segfault when trying to access members of struct?

每当我尝试打印存储在结构中的值时,我都会遇到分段错误。使用 Valgrind,我能够将它缩小到一个代码块,但我不确定我做错了什么。我是否错误地初始化了我的结构?

每当我 运行 valgrind 时,它告诉我有一个 大小为 8 的无效写入,我说 newList->data = d .

typedef struct List {
  struct List *np[Ends];        // next/prev neighbors
  Data data;
} *List;

typedef void *Data;

static void put(Data d) {
  List newList = malloc(sizeof(List));
  newList->data = d;
}

这是一个例子,说明为什么 typedef 指针是不好的做法。

因为 List 被定义为 struct List * 的别名,sizeof(List) 给你的是指针的大小,而不是结构的大小。因此,您没有分配足够的内存。

您想要 malloc(sizeof(struct List)) 或(最好)malloc(sizeof *newlist)