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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:44:10