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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 13:15:55