我是C语言的初学者,所以如果这个疑问太明显,我会道歉。
被认为是解决此问题的最有效方法:假设您有一个char数组ORIG,使用它后,您应该有一个新的char数组DEST。因此,如果我想为此目标创建功能,最好的方法是:
谢谢!
答案 0 :(得分:4)
这在很大程度上取决于您的函数的性质。
在第一种情况下,该函数必须为结果分配存储空间(或返回指向某些static
对象的指针,但这不是线程安全的)。这 可能是正确的做法,例如用于复制字符串的函数,例如POSIX'strdup()
。这也意味着当不再需要结果时,调用者必须在结果上使用free()
。
第二种情况要求调用者提供存储。这通常是在C语言中完成这些操作的惯用方式,因为在这种情况下,调用方可以编写
char result[256];
func(result, "bla bla");
,因此使用 automatic 对象保存结果。它还具有好处,您可以使用实际的返回值来表示错误。
答案 1 :(得分:1)
这都是有效的方法,但是我建议使用后者,因为这意味着您可以将内容加载到任何内存块中,而返回的数组必须在堆上并被释放通过设计。 同样,这两种都是有效的做事方式,这只是一个准则。通常应视情况而定。
答案 2 :(得分:1)
这取决于 如果您知道DEST的长度将与ORIG的长度相同,那么我将采用第二种方法,因为那样您就不必为函数内部的dest动态分配内存了(记住要在函数外部释放它)。 如果长度不同,则必须动态分配内存,并且可以通过两种方式进行分配: 1.与您的第一种方法一样,要从c函数中返回数组,您必须分配一个新数组并返回其地址(指针) 2.该函数可以接收两个参数,一个是ORIG,第二个是指向RES的双指针,因为该函数接收到一个双指针,因此它可以在内部分配一个数组并通过该参数返回它。 1-在代码方面更“干净”,并且在用户体验(用户是呼叫者)方面更易于使用
祝你好运!
答案 3 :(得分:1)
在选项1中,您将必须动态分配(malloc)输出数组。这意味着您可能会发生内存泄漏。在选项2中,为您提供了输出数组,因此没有泄漏的机会,但是有可能输出数组的大小不足,并且在写入时会出现缓冲区溢出。
两种方法都可以接受,其中一种方法与另一种方法相比可能会有很小的性能差异,但这确实取决于您的选择。
我个人是一名谨慎的程序员,我会选择第3种方法:
/* Returns 0 on success, 1 on failure
Requires : inputSize <= outpuSize
input != output
input != null
output != null
*/
int DoStuff (char* output, size_t outputSize, char* input, size_t inputSize);
(很抱歉,如果这不是正确的C,已经有几十年了:) (根据Felix Palmen的观点进行编辑。)