You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么尝试访问结构体(struct)成员时会触发段错误(segfault)?

问题原因

你代码的核心错误是malloc分配的内存大小不足,根源在类型别名的定义上:

  • 你定义的typedef struct List { ... } *List; 中,List是指向struct List结构体的指针类型,而非结构体本身的类型。
  • 执行malloc(sizeof(List))时,实际只申请了一个指针的内存空间(64位系统下为8字节),远小于struct List结构体实际需要的内存大小。
  • 给newList->data赋值时,写入操作已经超出了你申请的内存边界,所以Valgrind会报「大小为8字节的无效写入」,运行时直接触发段错误。

修复方案

两种修复方式二选一即可,更推荐第二种:

方案1:直接调整内存申请的大小计算

显式指定申请struct List结构体的大小:

static void put(Data d) {
  List newList = malloc(sizeof(struct List));
  // 补充np指针数组初始化,避免野指针
  newList->np[0] = NULL;
  newList->np[1] = NULL;
  newList->data = d;
}

方案2:调整类型别名定义(可读性更高,避免后续踩坑)

不要把指针类型藏在别名里,降低代码的歧义:

// List定义为结构体类型本身
typedef struct List {
  struct List *np[Ends];        // next/prev neighbors
  Data data;
} List;

typedef void *Data;

static void put(Data d) {
  // 指针类型显式写为List*
  List *newList = malloc(sizeof(List));
  // 初始化指针成员
  newList->np[0] = NULL;
  newList->np[1] = NULL;
  newList->data = d;
}

其他注意点

你当前的put函数只完成了节点内存申请和数据赋值,没有把节点接入现有链表的逻辑,申请的内存如果后续没有被释放会造成内存泄漏,建议补充对应逻辑。

内容的提问来源于stack exchange,提问作者backward forward

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 02:54:03