-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

1

への最初の引数getcwdは、NULL または既存のバッファーへのポインターのいずれかでなければなりません。これは、ルーチンを設計する方法の手がかりでもあります。また:

  • パラメータとして既存のバッファへのポインタを受け入れ、サイズを受け入れ、それらをgetcwdまたはに渡します
  • に NULL を渡しますgetcwd

どちらの場合も、同じ方法でポインタを返しますgetcwd。設定したものへのポインターを渡すよう呼び出し元に要求することは、不必要に複雑です。物事をシンプルに保つという原則に基づいて、そうしないでください。

最初のケースでは、ポインターを返す唯一の理由は、エラーが発生したかどうかを示すことです。エラーが発生しない場合、呼び出し元はルーチンにバッファーを渡したので、バッファーがどこにあるかを既に認識しています。

retあなたのコードは、との使用について混乱を示していますcwd。に渡された値がgetcwdnullretでない場合は、返されて に割り当てられた値と同じです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 に答える