使用 free() 的 HTTP 客户端:释放 char 内容时出现无效指针错误 **

HTTP client with free(): invalid pointer error while freeing contents of char **

我找遍了这个问题的解决方案,但像 Valgrind 和 GDB 这样的工具对我没有帮助。 Valgrind 甚至没有完成 运行 程序,GDB 只是告诉我自相矛盾的信息。我有一个 HTTP 客户端,它从从 Web 服务器检索到的 headers 中分配一个字符串列表。当试图释放这个单独分配的字符串的分配列表时,它决定在我尝试修复 header-parsing 函数切断最终 header 的问题后调用 free(): invalid pointer。我已经看了好几个小时了,但我找不到一个问题。

为确保代码有效,我在两个主要站点上对其进行了测试:http://www.google.com/ and http://en.wikipedia.org/。当我修复另一个示例的内存错误时,通常一次只有一个有效。

这里是我解析 header 字符串的地方(一个在 header 之间包含 \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

这一行:

returnHeaders[n+1] = NULL;

写入超过 returnHeaders 数组(具有 n+1 个元素)的末尾。