-2

像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

4 回答 4

2

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

有三种基本方法可以从函数返回指向字符串(或更一般地说是数组)的指针,所有这些方法都可能非常不方便。

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

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

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

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

于 2013-05-13T18:37:22.580 回答
1

的第一个参数getcwd必须是 NULL 或指向现有缓冲区的指针。这也是一个关于如何设计你的例程的线索。任何一个:

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

无论哪种情况,都以相同的方式返回一个指针getcwd。要求调用者将指针传递给您设置的东西是不必要的复杂。所以不要这样做,只是本着保持简单的原则。

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

ret您的代码显示了对和的使用的一些混淆cwd。如果传递给getcwdin的值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;
}
于 2013-05-13T18:27:12.900 回答
1

一般的 C 风格是你应该返回一个指针并在失败时返回 NULL

你需要让调用者非常清楚内存的所有权。他们是否拥有或释放它(如果它的静态数据可能还有它的线程安全性)

于 2013-05-13T18:28:10.977 回答
0

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

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

于 2013-05-13T18:17:22.953 回答