【问题标题】:Free() : invalid next size (fast) errorFree() : 下一个尺寸无效(快速)错误
【发布时间】:2016-08-24 03:01:16
【问题描述】:

所以当我运行我的代码时,我一直运行到这个错误: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 是回车换行。

【问题讨论】:

  • 你在某处分配内存。然后你写出那个记忆的界限。这是导致此类错误的唯一原因。
  • 我不认为这是@JoachimPileborg 的情况,我发布了一个答案。我认为他的malloc() 不是应有的样子!
  • 另外,当你有一个指针时,那个指针上的sizeof 会给你指针的大小,而不是它指向的大小。在 32 位系统上,它很可能是 4,而在 64 位系统上,它很可能是 8
  • @gsamaras 这正是原因。分配太小,OP 写入超出分配范围。
  • 我以为这就是为什么会有strdup

标签: c string pointers malloc free


【解决方案1】:

改变这个:

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

到这里:

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

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

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


顺便说一句,我相信将代码的 cmets 写在代码行上方(而不是紧挨它)更为常见。 :)

【讨论】:

  • 非常感谢您的回答,它帮了我很多忙!
  • 不客气!您看到@SillyRab,您发布了一个很好的问题,尤其是一个可以实际回答的问题,因为它包含所有必需的信息,太棒了!那是其他人和我赞成的。很高兴我能帮上忙!
【解决方案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 上分配(以考虑空字符)。

【讨论】:

  • sizeof ans strlen return size_t 应该用%zu打印。使用错误的格式说明符打印会调用未定义的行为。如果size_t 与该平台上的long 不同怎么办?
  • 感谢您的回答,内容非常丰富!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-23
  • 2012-10-25
相关资源
最近更新 更多