C语言 我的 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("%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;

相关内容

  • 没有找到相关文章

最新更新