在c?
中使用char指针返回或传递字符串的最佳方法是什么?我有一个看起来像这样的函数:
char *test_getcwd(){
char *cwd;
char *ret;
if ((cwd = getcwd( ret, pathconf(".",_PC_PATH_MAX) )) == NULL){
perror ( "Error on calling getcwd() function" );
}else if (__INCLUDE_LEVEL__ == 0){
puts( cwd );
}
free( cwd );
return ret;
}
我应该将其更改为:
int test_getcwd(const **pass){
char *cwd;
char *ret;
if ((cwd = getcwd( ret, pathconf(".",_PC_PATH_MAX) )) == NULL){
perror ( "Error on calling getcwd() function" );
}else if (__INCLUDE_LEVEL__ == 0){
puts( cwd );
}
free( cwd );
*pass = ret;
return 0;
}
或者保持原样或者改变其他东西?
可能已经提出过类似的问题,但我的目标是找到最佳实践。
答案 0 :(得分:2)
我确定这是重复的,但是......
从函数返回指向字符串(或更一般地说是数组)的指针有三种基本方法,所有这些方法都会令人烦恼。
您可以返回指向函数内定义的static
数组的第一个元素的指针。数组的大小必须是编译时常量,并且您将为每次调用重用相同的数组,因此连续调用将破坏先前调用的结果。
您可以要求调用者将指向第一个元素的指针传入一个数组,可能还有另一个参数来指定其大小。这给调用者带来了负担,调用者必须管理分配和释放,并且可能无法知道所需的大小。
您可以使用malloc
在堆上分配数组。这是最灵活的方法,但它使调用者负责free
数组。
你不能在函数内部定义一个数组,并返回指向其第一个元素的指针。当函数返回时,数组不再存在,留下一个悬空指针。
答案 1 :(得分:1)
getcwd
的第一个参数必须是NULL或指向现有缓冲区的指针。这也是关于如何设计日常工作的线索。之一:
getcwd
或getcwd
。在任何一种情况下,以与getcwd
相同的方式返回指针。要求调用者将指针传递给您设置的内容是不必要的复杂。所以不要这样做,只是保持简单的原则。
在第一种情况下,返回指针的唯一原因是指示是否发生错误。当没有发生错误时,调用者已经知道缓冲区的位置,因为它们将缓冲区传递给例程。
您的代码显示了对ret
和cwd
用法的一些疑惑。如果传递给getcwd
中的ret
的值不为null,则返回的值与cwd
相同。您不能同时释放该指针并将其返回给要使用的调用者。考虑一下:
char *test_getcwd()
{
char *ret = getcwd(NULL, ps_test_pathconf(".",_PC_PATH_MAX));
if (ret == NULL)
perror("Klaida iškvietus getcwd() funkciją");
else if (__INCLUDE_LEVEL__ == 0)
puts(ret);
return ret;
}
答案 2 :(得分:1)
一般的C样式是你应该返回一个指针并在失败时返回NULL
你需要让调用者非常清楚内存的所有权。他们是否拥有或免费(如果其静态数据可能是其线程安全性)
答案 3 :(得分:0)
除非你把它放在堆上,否则它不能像那样返回一个字符指针,或者它与你使用它的范围相同(这意味着你不会返回)它)。
你应该做的是在堆上分配空间来放置你的字符串,然后从函数中返回指针的地址。然后你的字符串在堆中,你可以稍后访问它。