Linux下malloc与struct引发Segmentation fault问题求助
问题分析:Segmentation fault 的根源
咱们直接点破问题核心——你的initEntry函数根本没把malloc出来的有效地址传递回main里的list变量!
核心原因:C语言的参数传递是「值传递」
当你调用initEntry(list)时,实际上是把list的副本传给了函数里的entry参数。在initEntry里执行entry = malloc(...),只是修改了这个副本的地址,main里的原始list变量完全没变化——它还是一个未初始化的野指针(随机垃圾值)。
当你执行list->value = 5;时,相当于尝试通过一个无效指针去写内存,这直接触发了段错误。而去掉这一行后,你只是调用了函数但没去访问那个无效指针,所以程序不会崩溃,但initEntry的初始化工作其实完全没生效。
修复方案:两种常见解决办法
1. 使用双指针(指针的指针)传递
把函数参数改成指针的指针,这样就能修改原始指针的地址了:
#include <stdlib.h> struct entry { int value; }; void initEntry(struct entry **entry) { // 修改传入的指针本身的地址 *entry = malloc(sizeof(struct entry)); (*entry)->value = 0; } int main() { struct entry *list; // 传入list的地址 initEntry(&list); list->value = 5; // 记得释放内存,避免泄漏 free(list); }
2. 让函数返回malloc后的指针
更直观的方式是让initEntry直接返回分配好的结构体指针:
#include <stdlib.h> struct entry { int value; }; struct entry* initEntry() { struct entry *entry = malloc(sizeof(struct entry)); entry->value = 0; return entry; } int main() { struct entry *list = initEntry(); list->value = 5; free(list); }
额外提醒
不管用哪种方式,记得用完动态分配的内存后要调用free,不然会造成内存泄漏哦。
内容的提问来源于stack exchange,提问作者holo
相关产品推荐
相关产品推荐

