基本上问题归结为:
我加载一个文件,将所有每个字符写入一个char *变量,该变量具有malloc()文件的长度。然后我返回该变量并打印它,然后我释放()该变量的内存,并尝试再次打印该打印它的变量。
我是C的新手,所以我处理保存文本内容的变量的内存可能有些不对劲。
我尝试使用char [(ftell(file)]而不是malloc和char *,但是函数没有返回任何内容。这可能是因为它是一个局部变量,当函数返回时会被释放,对吧? / p>
以下是我的代码:
main.c中:
#include <stdio.h>
#include <stdlib.h>
#include "data/filesystem/files.h"
int main(){
char *filebuffer = retrieve_file_content("assets/test.txt");
printf("%s", filebuffer);
free(filebuffer);
printf("%s", filebuffer);
return 0;
}
files.c:
#include <stdio.h>
#include <stdlib.h>
char *retrieve_file_content(char* path){
FILE *file;
file = fopen(path, "r");
if(file){
fseek(file, 0L, SEEK_END);
char *filebuffer = malloc(ftell(file));
if(filebuffer == NULL){ return NULL; }
fseek(file, 0L, SEEK_SET);
int i = 0;
int buffer = getc(file);
while(buffer != EOF){
filebuffer[i] = buffer;
buffer = getc(file);
i++;
}
fclose(file);
return filebuffer;
}else{
return NULL;
}
}
的test.txt:
heheasdasdas
输出:
heheasdasdas
heheasdasdas
提前致谢!
答案 0 :(得分:10)
free只标记有问题的内存可以再次自由分配,这意味着它可以被重用。但它没有将释放的内存设置为任何值。您的示例是所谓的UB(未定义行为)。具有未定义行为的程序在技术上可以做任何事情 - 包括错误/奇怪的行为,良好的行为,或通过Skype订购披萨:)
答案 1 :(得分:3)
您观察到的是未定义的行为。这次它适用于你,它可能会在下次崩溃。不要这样做。
调用free()
后,内存块所有权将传递给C运行时,并且不会修改存储在块中的数据(后者是出于性能原因而完成的)。碰巧该块仍然映射到进程内存中,因此您可以安全地读取它。但是,根据多个条件,这样做会导致程序崩溃或程序读取更改的数据或任何其他后果。切勿尝试访问已经free()
d。
答案 2 :(得分:1)
程序的行为是未定义的:C标准没有说明在调用free
之后内存会发生什么,只是你不应再使用它了。大多数实现将其放回到空闲列表中,因此下一次调用malloc
可能会使用它。有些人将其返回给操作系统,但只有小型计算机的C实现可能会这样做。有些人会擦拭它,但只有高安全性的实施可能会这样做。
I.e。:你的程序的行为完全取决于巧合,并且可能在明天/一年中/当月亮满了时可能无法工作。