C语言数组分配时触发Heap Buffer Overflow问题求助
堆缓冲区溢出问题的解决方法
你的代码触发堆缓冲区溢出的核心原因是分配结构体内存时计算大小错误:
在sfrStruct函数中,你用malloc(sizeof(SFR *))分配SFR结构体的内存,但SFR *是指针类型(64位系统下占8字节),而你的SFR结构体实际包含一个double(8字节)和一个指针(8字节),总大小为16字节。仅分配8字节内存后,给结构体成员赋值时会超出内存范围,直接触发溢出错误。
修正后的代码
typedef struct scaledFootrule { double minTotalSFR; int *tempPermutation; } SFR; static SFR *sfrStruct(int urlSize) { // 修正:使用sizeof(SFR)获取结构体实际大小 SFR *sfr = malloc(sizeof(SFR)); if (sfr == NULL) { fprintf(stderr, "error: out of memory\n"); exit(EXIT_FAILURE); } sfr->minTotalSFR = MAX_TOTAL_SFR_DIST; sfr->tempPermutation = malloc(sizeof(int) * urlSize); // 额外建议:检查tempPermutation的内存分配是否成功,避免内存泄漏 if (sfr->tempPermutation == NULL) { fprintf(stderr, "error: out of memory for tempPermutation\n"); free(sfr); exit(EXIT_FAILURE); } return sfr; }
额外提示
- 分配结构体内存时,建议用
sizeof(*sfr)代替sizeof(SFR),这样即使后续结构体类型改名,代码也无需修改,比如:SFR *sfr = malloc(sizeof(*sfr)); - 所有动态分配的内存都要检查分配是否成功,避免空指针访问,同时在分配失败时释放已分配的内存,防止内存泄漏。
内容的提问来源于stack exchange,提问作者peanutt
相关产品推荐
相关产品推荐

