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
相关产品推荐
相关产品推荐

