更新:根据下面我认为我理解的反馈,我修改了代码如下,但它仍然很麻烦:
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("%lun", (count + 1) * sizeof(char));
}
if (feof(file))
{
*content = filebuffer;
*length = count;
}
下面是一些代码,旨在通过一个文件,该文件通过 popen 通过管道传输到函数(它是一个 php 文件(,并将其存储到缓冲区中,然后为内容*提供相同的指针和 *长度读取的字节数。
但是它不起作用。瓦尔格林德 说:
==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 noesn");
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;
}
欢迎任何反馈,提前感谢。
realloc
的论点是错误的。
sizeof(filebuffer)
等于 sizeof(char*)
.它不会计算分配的数组的大小。
您需要使用另一个变量跟踪大小并使用该变量。 count
似乎是那个变量,但从您的代码中不清楚您在做什么以及这些变量代表什么。
此外,当您使用
filebuffer = realloc(NULL, some_size);
它相当于
filebuffer = malloc(some_size);
这会导致大量内存泄漏。要阻止内存泄漏,您需要使用
filebuffer = realloc(filebuffer, some_size);
您的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;