我的malloc / realloc出了什么问题?

时间:2016-04-30 05:11:05

标签: c malloc

更新:根据我认为我理解的下面的反馈,我已将代码修改如下,但仍然很麻烦:

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;
    }

欢迎提出任何反馈,并提前致谢。

2 个答案:

答案 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;