返回char指针的最佳方法是什么?

时间:2013-05-13 18:15:59

标签: c pointers

在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;
}

或者保持原样或者改变其他东西?

可能已经提出过类似的问题,但我的目标是找到最佳实践。

4 个答案:

答案 0 :(得分:2)

我确定这是重复的,但是......

从函数返回指向字符串(或更一般地说是数组)的指针有三种基本方法,所有这些方法都会令人烦恼。

  • 您可以返回指向函数内定义的static数组的第一个元素的指针。数组的大小必须是编译时常量,并且您将为每次调用重用相同的数组,因此连续调用将破坏先前调用的结果。

  • 您可以要求调用者将指向第一个元素的指针传入一个数组,可能还有另一个参数来指定其大小。这给调用者带来了负担,调用者必须管理分配和释放,并且可能无法知道所需的大小。

  • 您可以使用malloc在堆上分配数组。这是最灵活的方法,但它使调用者负责free数组。

不能在函数内部定义一个数组,并返回指向其第一个元素的指针。当函数返回时,数组不再存在,留下一个悬空指针。

答案 1 :(得分:1)

getcwd的第一个参数必须是NULL或指向现有缓冲区的指针。这也是关于如何设计日常工作的线索。之一:

  • 接受指向现有缓冲区的指针作为参数,并接受大小,并将其传递给getcwd
  • 将NULL传递给getcwd

在任何一种情况下,以与getcwd相同的方式返回指针。要求调用者将指针传递给您设置的内容是不必要的复杂。所以不要这样做,只是保持简单的原则。

在第一种情况下,返回指针的唯一原因是指示是否发生错误。当没有发生错误时,调用者已经知道缓冲区的位置,因为它们将缓冲区传递给例程。

您的代码显示了对retcwd用法的一些疑惑。如果传递给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)

除非你把它放在堆上,否则它不能像那样返回一个字符指针,或者它与你使用它的范围相同(这意味着你不会返回)它)。

你应该做的是在堆上分配空间来放置你的字符串,然后从函数中返回指针的地址。然后你的字符串在堆中,你可以稍后访问它。