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

为何跨文件访问malloc分配的结构体指针时触发段错误?

问题分析与解决

你的段错误根源是全局变量ptr和main函数里的局部ptr重名冲突。

main.c里声明的cmd_t *ptr = NULL;是跨文件共享的全局变量,但你在main函数内部又定义了一个同名的局部指针cmd_t *ptr = malloc(sizeof(cmd_t));——这会导致局部ptr覆盖全局ptr,全局ptr始终保持初始的NULL值。opcode.c的push函数访问ptr->n时,本质是对空指针解引用,直接触发段错误。

修复代码

只需要修改main函数,去掉局部ptr的类型声明,直接给全局ptr赋值:

#include "main.h"
cmd_t *ptr = NULL;

int main(void)
{
    // 移除局部变量声明,直接操作全局ptr
    ptr = malloc(sizeof(cmd_t));
    ptr->n = 5;
    push("line");
    
    return (0);
}

这样全局ptr会被正确分配内存并赋值,opcode.c的push函数就能正常访问结构体成员了。

另外你尝试用static修饰全局变量是错误的——static会让全局变量变成文件私有,其他文件根本无法访问,反而会加剧问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:09:26