8

在 C 中编写返回字符串的方法时,什么被认为是更好的做法?

传入缓冲区和大小:

void example_m_a(type_a a,char * buff,size_t buff_size)

或制作并返回适当大小的字符串:

char * example_m_b(type_a a)

PS您如何看待返回缓冲区ptr以允许分配样式和嵌套函数调用,即

char * example_m_a(type_a a,char * buff,size_t buff_size)
{
...
return buff;
}
4

5 回答 5

5

将缓冲区作为参数传递可以解决此类代码可能遇到的大多数问题。

如果它返回一个指向缓冲区的指针,那么您需要确定它是如何分配的以及调用者是否负责释放它。该函数可以返回一个不需要释放的静态指针,但它不是线程安全的。

于 2011-05-05T05:08:42.640 回答
3

传递缓冲区和大小通常不太容易出错,尤其是在字符串的大小通常是“合理”大小的情况下。如果您动态分配内存并返回一个指针,则调用者负责释放内存(并且必须记住根据函数的分配方式为内存使用相应的释放函数)。

如果您检查诸如 Win32 之类的大型 C API,您会发现几乎所有返回字符串的函数都使用第一种形式,即调用者传递缓冲区和大小。只有在有限的情况下,您才能找到函数分配返回值的第二种形式(我目前想不出任何形式)。

于 2011-05-05T05:07:48.850 回答
1

我更喜欢第二个选项,因为它允许函数决定需要多大的缓冲区。呼叫者通常无法做出该决定。

于 2011-05-05T05:07:50.370 回答
1

传递缓冲区和大小样式的另一种替代方法,使用返回码:

size_t example_m_a(type_a a,char * buff,size_t buff_size)

零返回码表示调用者的缓冲区是合适的并且已被填充。

返回码 > 0 表示调用者的缓冲区太小,并显示实际需要的大小,允许调用者调整其缓冲区大小并重试。

于 2011-05-05T05:41:35.867 回答
0

在大多数情况下,最好传递缓冲区地址和长度。它不易出错,并且不必担心内存泄漏。事实上,在一些紧凑的嵌入式系统中,完全不希望使用堆。但是,该函数不能超出缓冲区,因为这可能会使系统崩溃,甚至更糟:使其容易受到黑客攻击。

我唯一一次看到函数返回分配的缓冲区是 libxml 的 API,用于从 xmlDoc 生成 XML 文本。

于 2011-05-05T06:08:59.133 回答