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

时间:2015-05-04 04:32:35

标签: c arrays http pointers free

我已经全神贯注地寻找这个问题的解决方案,但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

1 个答案:

答案 0 :(得分:3)

这一行:

returnHeaders[n+1] = NULL;

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