Free():无效的下一个大小(快)错误

时间:2016-08-24 03:01:16

标签: c string pointers malloc free

所以当我运行代码时,我一直在运行此错误:free(): invalid next size(fast)。如果我在函数结束时删除了free,我知道我正在泄漏内存,但我不明白为什么会出现这个错误。

我认为这与我错误地分配内存有关,但我似乎找不到修复,这是我的代码:

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*行的格式为:

  

方法SP request-target SP HTTP-version CRLF

其中SP是空格,CRLF是carridge返回,换行。

2 个答案:

答案 0 :(得分:4)

改变这个:

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

到此:

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

第一个为line的大小分配空间,这是一个POINTER!

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

顺便说一下,我认为将代码的注释写在代码行之上(而不是在代码旁边)更为常见。 :)

答案 1 :(得分: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上分配(以考虑空字符)。