我怎么知道重新分配多少内存?

时间:2012-10-27 18:49:29

标签: c memory alloc

我有一个关于我的应用程序设计的问题。 这是伪代码:

char* buffer_to_be_filled = (char*) malloc(somesize);
fill_the_buffer(buffer_to_be_filled);
free(buffer_to_be_filled);

问题在于我不知道fill_the_buffer需要多大的尺寸。

我在考虑fill_the_buffer函数中的解决方案。 我可以在需要时重新分配内部空间;问题是,有没有办法找出我有多少空间?

这通常如何解决?我认为分配缓冲区的人也应该重新分配缓冲区,对吗?

注意:我正在使用fread函数填充缓冲区,所以我不知道需要多少空间。

4 个答案:

答案 0 :(得分:3)

您必须将缓冲区大小传递给fill_the_buffer函数。如果缓冲区不够大,则函数必须返回错误值(f / e -1)。如果成功,您的函数可以返回写入字节的数量。这种方法是C语言的常用做法。

答案 1 :(得分:3)

你的函数不能realloc传递给它的指针,因为realloc不能保证返回它传递的相同指针(新缓冲区可能太大而无法扩展) -地点)。典型的解决方案是函数采用指定缓冲区大小的第二个参数,并在缓冲区太小时返回错误代码。理想情况下,错误代码会告诉用户缓冲区需要多大,因此他们可以自己重新分配它并调用该函数。例如,从snprintf的手册页(有此问题):

  

函数snprintf()和vsnprintf()写入的字节数不超过大小(包括终止空字节('\ 0'))。如果输出由于此限制而被截断,则返回值是字符数(不包括终止空字节),如果有足够的空间,则该字符数将被写入最终字符串。因此,大小或更大的返回值意味着输出被截断。

答案 2 :(得分:2)

似乎fill_the_buffer()函数处于更好的位置才能知道...
   - 如何最初确定缓冲区的尺寸和/或
   - 什么时候重新分配缓冲区和多少。

因此,更改API可能是合适的:

char * fill_the_buffer()
或者是    char * fill_the_buffer(size_t max_amount_caller_wants)

fill_the_buffer()的调用者仍然负责处理函数返回的缓冲区,但是分配和维度将留给函数的逻辑。

这种方法通常遵循将实现细节留在较低级别的想法,使较高级别更具可读性。

答案 3 :(得分:0)

如果你在分配空闲内存方面没有问题,我有一个建议:
使用malloc在程序开头分配初始大小,(尝试对此初始分配做出很好的猜测),然后在fill_the_buffer中,您可能需要分配更多内存,或者您可能需要需要所有分配的内存。在第一种情况下,您可以在一些步骤中分配适当数量的内存(取决于您的应用程序和您的可用内存)(例如每次泄漏时为10MB)&然后恢复填充缓冲区,直到你需要更多的内存和缓冲区填充时重复此操作。 在第二种情况下,您可以简单realloc来减少缓冲区已分配内存的大小 但是当你想增加缓冲区的大小时,请特别注意使用realloc,因为它通常会导致很大的开销(它必须找到足够大的空闲内存部分,然后将所有旧数据复制到新的部分和释放旧节)。