使用typedef与malloc时程序触发断点问题求助
问题:typedef与malloc结合使用时触发断点异常
问题现象
运行程序时在exe_common.inl第297行触发断点,通过VS2019调试发现断点在main函数执行完毕后触发,即便调用free_group函数也会触发该断点,main函数甚至无法正常执行return 0;。触发断点的代码行如下:
if (!has_cctor)
_cexit();
相关代码文件
groups.h
#include "headers.h" #include "info.h" #include "sub_list.h" typedef struct group_entity *group; group new_group(int id); void free_group(group group);
groups.c
#include "groups.h" struct group_entity { int gId; info gFirst; info gLast; subinfo gSub; }; group new_group(int id) { group new_group = malloc(sizeof(group)); if (!new_group) { return NULL; } new_group->gId = id; new_group->gFirst = NULL; new_group->gLast = NULL; new_group->gSub = NULL; return new_group; } void free_group(group group) { free(group); }
headers.h
#pragma once #include <stdlib.h> #include <stdio.h> #include <malloc.h> #define MG 5 /* Length of Groups Array. */
main.c
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdint.h> #include <stddef.h> #include "headers.h" #include "groups.h" #include "info.h" #include "sub_list.h" int main() { group new_object = new_group(5); return 0; }
问题原因
核心错误出在new_group函数的内存分配语句:
group new_group = malloc(sizeof(group));
这里的group是struct group_entity*的typedef,所以sizeof(group)计算的是指针的大小(32位系统为4字节,64位系统为8字节),但实际需要分配的是struct group_entity结构体的完整内存空间。分配的内存远小于结构体实际需求,导致后续给结构体成员赋值时发生内存越界,破坏了堆内存的完整性,最终在程序退出时触发堆检查的断点。
解决方案
修改new_group函数中的内存分配语句,确保分配的是结构体的实际大小:
方案1:直接指定结构体类型
group new_group(int id) { group new_group = malloc(sizeof(struct group_entity)); if (!new_group) { return NULL; } new_group->gId = id; new_group->gFirst = NULL; new_group->gLast = NULL; new_group->gSub = NULL; return new_group; }
方案2:利用指针指向的类型计算(更安全)
这种写法的好处是,即便后续group对应的类型发生变更,代码也不需要修改:
group new_group(int id) { group new_group = malloc(sizeof(*new_group)); if (!new_group) { return NULL; } new_group->gId = id; new_group->gFirst = NULL; new_group->gLast = NULL; new_group->gSub = NULL; return new_group; }
另外,建议在main函数中调用free_group释放已分配的内存,避免内存泄漏:
int main() { group new_object = new_group(5); free_group(new_object); return 0; }
内容的提问来源于stack exchange,提问作者Dr.GV
相关产品推荐
相关产品推荐

