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

C语言构造HTTP请求的函数调用malloc报invalid size错误如何解决

问题根源

你遇到的报错是典型的堆内存越界写入破坏了malloc的元数据结构导致的,代码里有两个核心错误:

  • 内存分配的参数逻辑错误:你原本想写strlen(start) + 1,实际写成了strlen(start + 1),相当于把指针偏移1位后再计算长度,本身就少分配了2字节(少算1个字符+没留末尾\0的位置)
  • 完全没有计算后续待拼接内容的总长度:你只分配了刚好能放下start字符串的内存,后续调用strcat拼接其他内容时,全部是在已分配内存的边界外写入,直接覆盖了堆上malloc用来记录内存块信息的元数据,等到系统再访问堆结构时就会抛出非法大小的错误。

修复方案

首先计算所有待拼接内容的总长度,再分配对应大小的内存,再依次拼接即可,修正后的代码如下:

char* integration_request(char* function, char* lower, char* upper,
        char* segments, char* threads) {
    char* start = "GET /integrate/";
    char* bs = "/";
    char* end = "HTTP/1.1\n\n";
    // 计算总需要的内存长度:各段长度相加 + 末尾\0的1字节
    size_t total_len = strlen(start) + strlen(bs)*5 + strlen(lower) + strlen(upper)
                    + strlen(segments) + strlen(threads) + strlen(function)
                    + strlen(end) + 1;
    char* request = malloc(total_len);
    // 判空避免空指针操作
    if(!request) return NULL;
    // 依次拼接内容
    strcpy(request, start);
    strcat(request, lower);
    strcat(request, bs);
    strcat(request, upper);
    strcat(request, bs);
    strcat(request, segments);
    strcat(request, bs);
    strcat(request,threads);
    strcat(request,bs);
    strcat(request,function);
    strcat(request, end);
    return request;
}

注意:调用这个函数拿到返回的request字符串使用完后,一定要手动调用free释放内存,避免内存泄漏。

内容的提问来源于stack exchange,提问作者Joe Nissen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 20:24:03