更新:根据我认为我理解的下面的反馈,我已将代码修改如下,但仍然很麻烦:
unsigned int count = 0;
char* filebuffer;
filebuffer = malloc(sizeof(char));
if (!filebuffer)
{
error(500);
return false;
}
while (fread(filebuffer, sizeof(char), 1, file) == 1)
{
count++;
filebuffer = realloc(filebuffer, count * sizeof(char));
printf("%lu\n", (count + 1) * sizeof(char));
}
if (feof(file))
{
*content = filebuffer;
*length = count;
}
下面是一些代码,用于通过popen(它是一个php文件)传递给函数的文件,并将其存储到缓冲区中,然后给内容*指针和* length读取的字节数。
然而它无法正常工作。 Valgrind说:
==7608== Conditional jump or move depends on uninitialised value(s)
==7608== at 0x4C31FCE: strstr (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==7608== by 0x4036C0: interpret (server.c:513)
==7608== by 0x401D66: main (server.c:259)
==7608== Uninitialised value was created by a heap allocation
==7608== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==7608== by 0x4C2CF1F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==7608== by 0x40418C: load (server.c:662)
==7608== by 0x403672: interpret (server.c:502)
==7608== by 0x401D66: main (server.c:259)
代码是:
unsigned int count = 0;
char* filebuffer;
filebuffer = malloc(sizeof(char));
if (!filebuffer)
{
printf("oh noes\n");
error(500);
return false;
}
while (fread(filebuffer, sizeof(char), 1, file) == 1)
{
count++;
filebuffer = realloc(NULL, sizeof(filebuffer) + sizeof(char));
}
if (feof(file))
{
*content = filebuffer;
*length = count;
}
欢迎提出任何反馈,并提前致谢。
答案 0 :(得分:2)
realloc
的论据是错误的。
sizeof(filebuffer)
等于sizeof(char*)
。它不会评估分配的数组的大小。
您需要使用其他变量跟踪大小并使用该变量。 count
似乎是变量,但您的代码中并不清楚您正在做什么以及这些变量代表什么。
此外,当您使用
时 filebuffer = realloc(NULL, some_size);
等同于
filebuffer = malloc(some_size);
导致大量泄露的记忆。要停止内存泄漏,您需要使用
filebuffer = realloc(filebuffer, some_size);
答案 1 :(得分:0)
你的realloc
没有占用先前分配的缓冲区,你也需要跟踪缓冲区的大小。
filebuffer = realloc(NULL, sizeof(filebuffer) + sizeof(char));
应该是
filebuffer = realloc(filebuffer, <the new size>);
但是filebuffer = malloc(sizeof(char));
只是看起来很糟糕,你为每种类型分配一个字节。如果您事先不知道文件的大小,我建议您逐块分配。
#define BLOCKSIZE 1024
char* filebuffer;
size_t current;
filebuffer = malloc(BLOCKSIZE);
current = BLOCKSIZE;
// in the loop
filebuffer = realloc(filebuffer, BLOCKSIZE + current);
current = BLOCKSIZE + current;