munmap_chunk():无效指针中止(内核转储)如何正确释放()

munmap_chunk():无效指针中止(内核转储)如何正确释放(),c,pointers,C,Pointers,我已经搜索了我面临的问题,但无法从给别人的答案中解决它。所以我在这里 代码如下: char *readFile(char *filename) { FILE *f = fopen(filename, "rt"); assert(f); fseek(f, 0, SEEK_END); long length = ftell(f); fseek(f, 0, SEEK_SET);

我已经搜索了我面临的问题,但无法从给别人的答案中解决它。所以我在这里

代码如下:

    char *readFile(char *filename) {
        FILE *f = fopen(filename, "rt");
        assert(f);
        fseek(f, 0, SEEK_END);
        long length = ftell(f);
        fseek(f, 0, SEEK_SET);
        char *buffer = (char *) malloc(length + 1);
        buffer[length] = '\0';
        fread(buffer, 1, length, f);
        fclose(f);
        
        return buffer;
    }
   int main(){
char *content = readFile("filename");
free() // what to do here?
}
以下是错误:

munmap_chunk(): invalid pointer
Aborted (core dumped)

如果我问的问题太简单,我道歉。我是新来的。

免费(&length+1)不确定您试图在那里做什么。你能解释一下吗<代码>长度
未动态分配,因此不应释放。也不知道
+1
是做什么用的。
免费(&length+1)
length
是一个
long
(因此x86上的
4
-字节或x86上的
8
-字节)。因此,释放
length+1
地址会尝试释放位于函数堆栈某处的地址(或在奇数情况下为1字节后)——这将导致各种未定义的行为。@kaylum我是第一次使用malloc()函数,正如我读到的,在使用malloc()之后,我们应该释放()它可以防止内存泄漏,释放过程应该与malloc()相反。这就是我使用free()的原因,但我不知道如何正确使用。@DavidC.Rankin它不是在堆中吗?
malloc
free
规则很简单-无论
malloc
返回什么,都是需要传递到
free
的确切指针。但是
free
只能在不再需要分配的内存时调用。在您的情况下,最终要释放的指针是
缓冲区
。但是,由于要将指针返回给调用方,因此不能释放它。在这种情况下,一旦不再需要缓冲区,调用方就有责任调用
free