我的malloc/realloc在这里有什么问题?
更新:每低于我想我明白了反馈,我已经修改了代码如下,但它仍然是麻烦:我的malloc/realloc在这里有什么问题?
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文件)传递给函数,并将其存储到一个缓冲区中,然后给内容*指定相同的指针和*长度为读取的字节数。
但它不工作。 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;
}
任何意见表示欢迎和感谢提前。
回答:
您的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;
回答:
realloc
的说法是错误的。
sizeof(filebuffer)
等于sizeof(char*)
。它不评估分配的数组的大小。
您需要使用另一个变量跟踪大小并使用该变量。 count
似乎是那个变量,但从代码中不清楚你正在做什么以及这些变量代表什么。
此外,当您使用
filebuffer = realloc(NULL, some_size);
它相当于
filebuffer = malloc(some_size);
导致大量泄漏的内存。要停止内存泄漏,您需要使用
filebuffer = realloc(filebuffer, some_size);
以上是 我的malloc/realloc在这里有什么问题? 的全部内容, 来源链接: utcz.com/qa/266267.html