2016-08-24 52 views
4

所以我一直运行到这个错误:free(): invalid next size(fast)当我运行我的代码。如果我在该函数结束时删除了自由,我知道我正在泄漏内存,但我不明白为什么我会收到此错误。免费():无效下一个大小(快)错误

我认为它有话跟我错误地分配内存,但我似乎无法找到修复,这里是我的代码:

bool parse(const char* line) //NOT WORKING JUST QUITE 
{ 
    char* copy = malloc(sizeof(line)); //allocate space for a copy of the line parameter 
    strcpy(copy, line); //copy the line parameter 

    char* method = strtok(copy, " "); //pointer to the method 
    char* reqLine = strtok(NULL, " "); //pointer to the requestline 
    char* version = strtok(NULL, "\r\n"); //pointer to the HTTP-Version 

    if (strcmp(method,"GET") != 0) //if the method is not GET 
    { 
     printf("%s\n", method); 
     printf("ERROR 405\n"); 
     return false; 
    } 
    if (strncmp(reqLine, "/", 1) != 0)//if the request line does not begin with a/character 
    { 
     printf("%c\n", reqLine[0]); 
     printf("%s\n", reqLine); 
     printf("ERROR 501\n"); 
     return false; 
    } 
    if (strchr(reqLine, 34) != NULL) //if the request line contains a " character 
    { 
     printf("%s\n", reqLine); 
     printf("ERROR 400\n"); 
     return false; 
    } 
    if (strcmp(version, "HTTP/1.1") != 0) 
    { 
     printf("%s", version); 
     printf("ERROR 505\n"); 
     return false; 
    } 

//free(copy); 
return true; 
} 

如果它有助于在const char*线传递是的形式:

method SP request-target SP HTTP-version CRLF

其中SP是一个空格,CRLF是回车,换行。

+1

您在某处分配内存。然后你写出那个记忆的界限。这是像这样的错误的唯一原因。 –

+0

我不认为这是这种情况@JoachimPileborg,我发布了一个答案。我认为他的'malloc()'不是它应该的! – gsamaras

+0

另外,当你有一个指针时,那个指针上的'sizeof'会给你指针*的大小*,而不是它指向的内容。在32位系统中,它很可能是“4”,而在64位系统中它很可能是“8”。 –

回答

4

更改此:

char* copy = malloc(sizeof(line)); 

这样:

char* copy = malloc(strlen(line) + 1); 

line的大小,这是一个指向第一个分配的空间!

虽然第二,分配空间等于字符串的长度line点,加一个,为NULL终止(请不要忘记这一点,你会活得更快乐 - 生命)! ;)


顺便说一句,我认为这是更常见的代码行(而不是旁边)写你的代码的评论。 :)

+1

非常感谢你的回答,它帮了我很多忙! – SillyRab

+0

欢迎您!你看@SillyRab,你发布了一个很好的问题,尤其是那些可以真正回答的问题,因为它有所有必需的信息,好极了!这是其他人和我upvoted。很高兴我帮了忙! – gsamaras

2

就行了:

char* copy = malloc(sizeof(line)); //allocate space for a copy of the line parameter 

你分配的内存来存储指针的大小。您需要分配字符串的长度。请参阅以下内容:

#include <stdio.h> 
#include <string.h> 

int main(int argc, const char* argv[]) { 
    const char *line = "this is a line"; 
    printf("sizeof line: %zu\n", sizeof(line)); 
    printf("strlen line: %zu\n", strlen(line)); 
    return 0; 
} 

输出:

sizeof line: 8 
strlen line: 14 

您应该分配上的strlen + 1(占空字符)。

+2

'sizeof' ans'strlen' return'size_t'应该用['%zu'](http://stackoverflow.com/q/940087/995714)打印。用错误的格式说明符打印会调用未定义的行为。如果在该平台上'size_t'与'long'不同? –

+0

谢谢你的回答,这是非常丰富的! – SillyRab

相关问题