我的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

回到顶部