我已经全神贯注地寻找这个问题的解决方案,但Valgrind和GDB等工具并没有帮助我。 Valgrind甚至没有完成程序的运行,而GDB只是告诉我与之相矛盾的信息。我有一个HTTP客户端,它从Web服务器检索的头中分配一个字符串列表。当试图释放这个单独分配的字符串的已分配列表时,它决定在我尝试修复标头解析函数的问题后切断最终标题后调用free(): invalid pointer
。我一直在看它几个小时,我找不到一个问题。
为了确保代码有效,我使用了两个主要网站对其进行了测试:http://www.google.com/和http://en.wikipedia.org/ 。通常只有一个在我修复另一个例子的内存错误时起作用。
这里是我解析头字符串的地方(头部之间包含\r\n
的字符串,结尾只有一个终止空字符):
char **generateHeaderList(char *headers) {
char **returnHeaders = NULL, *nextLine;
int len, n;
for (n = 0; (nextLine = strstr(headers, "\r\n")) != NULL; n++) {
len = nextLine - headers;
if (len == 0) break;
returnHeaders = realloc(returnHeaders, (n + 1) * sizeof(char *));
if (returnHeaders == NULL) {
printf("Failure to allocate memory at line %d.\r\n", __LINE__ - 2);
exit(1);
}
returnHeaders[n] = malloc((len + 1) * sizeof(char));
copyAndTerminateString(returnHeaders[n], headers, len);
headers = nextLine + 2;
}
len = strlen(headers); //here to returnHeaders[n+1] = NULL; is what I've added that's caused this error with some websites
if (len == 0) return returnHeaders;
returnHeaders = realloc(returnHeaders, (n + 1) * sizeof(char *));
if (returnHeaders == NULL) {
printf("Failure to allocate memory at line %d.\r\n", __LINE__ - 2);
exit(1);
}
returnHeaders[n] = malloc((len + 1) * sizeof(char));
copyAndTerminateString(returnHeaders[n], headers, len);
returnHeaders[n+1] = NULL;
return returnHeaders;
}
以下是我如何释放包含returnHeaders
中的数据的结构:
void freeHTTPresponse(HTTPresponse *freeResponse) {
int n;
for (n = 0; freeResponse->headers[n] != NULL; n++) {
free(freeResponse->headers[n]);
}
free(freeResponse->headers);
free(freeResponse->content);
free(freeResponse);
}
以下是完整代码(已编辑为仅打印出与我的问题相关的信息):http://pastebin.com/AWWTLpWH
答案 0 :(得分:3)
这一行:
returnHeaders[n+1] = NULL;
写入returnHeaders
数组的末尾(具有n+1
个元素)。