为何跨文件访问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
相关产品推荐
相关产品推荐

