在编写在C中返回字符串的方法时,最好的做法是什么?
传入缓冲区和大小:
void example_m_a(type_a a,char * buff,size_t buff_size)
或制作并返回适当大小的字符串:
char * example_m_b(type_a a)
P.S。你怎么看待返回缓冲区ptr以允许赋值样式和 嵌套函数调用,即
char * example_m_a(type_a a,char * buff,size_t buff_size)
{
...
return buff;
}
答案 0 :(得分:5)
传递缓冲区作为参数解决了此类代码可能遇到的大多数问题。
如果它返回一个指向缓冲区的指针,那么你需要决定它的分配方式以及调用者是否负责释放它。该函数可以返回一个不需要释放的静态指针,但它不是线程安全的。
答案 1 :(得分:3)
传递缓冲区和大小通常不易出错,特别是如果字符串的大小通常是“合理”的大小。如果你动态分配内存并返回一个指针,调用者负责释放内存(并且必须记住使用相应的内存自由函数,具体取决于函数如何分配它)。
如果检查大型C API(如Win32),您会发现几乎所有返回字符串的函数都使用调用者传递缓冲区和大小的第一种形式。只有在有限的情况下才能找到函数分配返回值的第二种形式(我现在想不到任何一种形式)。
答案 2 :(得分:1)
我更喜欢第二个选项,因为它允许函数决定需要多大的缓冲区。通常,来电者无法做出决定。
答案 3 :(得分:1)
使用返回码传递缓冲区和大小样式的另一种替代方法:
size_t example_m_a(type_a a,char * buff,size_t buff_size)
归零代码表示调用者的缓冲区是合适的并且已填写。
返回代码> 0表示调用者的缓冲区太小并显示实际需要的大小,允许调用者调整缓冲区大小并重试。
答案 4 :(得分:0)
在大多数情况下,传递缓冲区地址和长度是最好的。它不易出错,并且不必担心内存泄漏。实际上,在一些紧密的嵌入式系统中,完全不希望使用堆。但是,该函数不能超出缓冲区,因为这可能会使系统崩溃,更糟糕的是:使其容易受到黑客攻击。
我见过函数返回已分配缓冲区的唯一时间是libxml的API,用于从xmlDoc生成XML文本。