4

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

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

4 回答 4

3

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

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

于 2012-10-27T18:58:20.620 回答
2

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

于 2012-10-27T18:53:30.890 回答
2

似乎该fill_the_buffer()函数处于更好的位置来了解...
- 如何最初确定缓冲区的尺寸和/或
- 何时重新分配缓冲区以及分配多少。

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

char * fill_the_buffer()
或者可能
char * fill_the_buffer(size_t max_amount_caller_wants)

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

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

于 2012-10-27T18:56:24.393 回答
0

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

于 2012-10-27T19:06:59.330 回答