修改Player结构体成员后malloc执行报错(编译正常)问题咨询
哦,这是典型的malloc新手陷阱!
你遇到的崩溃问题,根源其实和新增的两个成员没有直接关系,问题出在你createPlayer函数里的内存分配代码上!
问题到底出在哪?
看这段代码:
p=malloc(sizeof(p));
这里的p是Player类型,而你已经把Playertypedef成了struct Player *——也就是指针类型。指针的大小在你的系统里是固定的(比如32位系统是4字节,64位是8字节),和它指向的结构体大小完全无关!
为什么之前能正常运行?
原来的struct Player大小刚好小于等于指针的大小,所以虽然你分配的内存其实不够,但写入的成员刚好没越界到破坏malloc内部结构的程度,属于“运气好”没触发崩溃。
为什么加了成员就炸了?
当你新增两个int成员后,struct Player的总大小已经远远超过了指针的大小。这时候malloc(sizeof(p))分配的那点内存根本装不下整个结构体,后续你对p->obj、p->touched这些成员的写入,其实是在越界篡改堆内存的未分配区域,直接破坏了malloc的内部管理链表,最终触发malloc(): invalid size的崩溃——哪怕你没碰那两个新增成员,前面的写入已经越界了!
怎么修复?
把malloc的参数改成要分配的结构体本身的大小,有两种靠谱的写法:
Player createPlayer(int posiX,int posiY){ Player p; // 写法1:直接用结构体类型的sizeof p = malloc(sizeof(struct Player)); // 写法2:用指针指向的对象的sizeof(更推荐,后续改结构体名也不用改这里) // p = malloc(sizeof(*p)); // 一定要加malloc失败的判断!避免空指针操作 if (p == NULL) { return NULL; } p->obj.posi.x=posiX; p->obj.posi.y=posiY; p->obj.life=100; p->touched=0; p->frequency=0; // 新增成员最好初始化,避免未定义行为 p->lastTouch=0; p->obj.damage=5; p->obj.friend=true; return p; }
额外提醒
- 永远不要用指针类型的
sizeof来分配它指向的结构体内存,这是C语言里非常常见的坑。 - 养成检查
malloc返回值的习惯,万一内存分配失败,后续操作空指针会引发更难排查的问题。 - 新增的成员记得初始化,C语言里malloc分配的内存是未初始化的,里面是随机值,可能引发奇怪的bug。
内容的提问来源于stack exchange,提问作者Cariamole
相关产品推荐
相关产品推荐

