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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 23:15:01