为什么尝试访问结构体(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
相关产品推荐
相关产品推荐

