C语言实现游程编码时触发heap buffer overflow的原因是什么
堆缓冲区溢出原因及代码错误汇总
- 指针类型定义错误
你写的char build= (char*)malloc(2*len);把build定义成了单字节char类型,而malloc返回的是堆内存地址指针,应该改为char *build = malloc(2 * len + 1);,额外加1是为字符串结束符\0预留空间,C语言中不需要强制转换malloc的返回值。 - 堆内存未初始化
malloc申请的内存存储的是随机垃圾值,strncat、strcat函数要求目标参数必须是合法的以\0结尾的C字符串,你直接调用这两个函数会导致函数从内存随机位置开始查找结束符,直接越界访问堆内存。申请内存后第一行加build[0] = '\0';初始化即可解决。 - 数字转字符逻辑完全错误
char *c = count+ "0";写法完全错误:"0"是字符串常量的内存地址,给地址加count数值得到的是野指针,访问这块内存属于非法越界。你需要的是把数字转为对应ASCII字符,应该写为char c = count + '0';,单引号包裹的'0'才是字符0的ASCII值。另外不能用strcat拼接单个字符,strcat要求源参数是\0结尾的字符串,单个字符没有结束标记,会把后续随机内存内容也拼接进去,直接手动给build对应位置赋值即可。 - 未添加字符串结束符
循环拼接完成后没有手动给build加结束符\0,后续调用strlen、printf等函数时,会持续越界访问内存查找结束符。 - 内存泄漏+无效代码
return build;之后的free(build);永远不会执行,属于无效代码。另外main函数中多次调用compress函数,每次都会申请新的堆内存,全程没有释放逻辑,会造成严重内存泄漏。 - 业务逻辑写反
containsDigit函数逻辑完全错误:当前统计的是非数字字符的数量,大于0就返回1,和你需要的「判断输入是否包含数字」的逻辑完全相反,会导致错误提示逻辑失效。 - 重复调用浪费资源
main函数中先调用compress计算压缩后长度,符合输出条件后又调用一次compress,重复分配内存、重复计算,第一次申请的内存直接丢失无法释放。
内容的提问来源于stack exchange,提问作者Kush Patel
相关产品推荐
相关产品推荐

