-2

空の を返したい場合はchar*、これを行うことができます

char* Fun1(void) {
 return "";
}

で同じ問題を想像してみてください。char**の空の配列を返したいと思いchar*ます。

一時変数を使用せずにこれを記述するより短い方法はありますか?

char** Fun2(void) {
 char* temp[1] = {""}; 
 return temp;
 // return {""}; // syntax error !
}

NULL目標は、文字列がポインターになる可能性があるという事実を隠すことです。

4

6 に答える 6

2

文字列リテラルで行ったことと同等のものは、次のようになります。

char const* const* Fun2(void) {
    static char const* const tmp[] = {""};
    return tmp;
}

しかし、質問へのコメントで述べたように、「空」の意味を再考する必要があるかもしれません。

また、returnが空でない場合にどうするかも考慮する必要があります。呼び出し元が返されたポインターを解放することになっている場合、文字列リテラルおよび/または静的配列へのポインターを返すことはできません。

于 2012-06-20T08:46:38.717 に答える
1

戻り時にスコープ外になるため、一時変数を使用しないでください。同じ空の配列を返す複数の関数がある場合、同じ「空の配列」へのポインターを返すことができます。

char* EmptyArray[1] = {""}; 

char** Fun2(void) 
{
  return EmptyArray;
}

また、これにより、ポインターを比較することにより、関数が具体的に空を返したかどうかを簡単に検出できます。

char **arr =  Fun2(); 

if (arr == EmptyArray)
  ...
于 2012-06-20T08:49:53.470 に答える
1

まず、割り当てられたばかりの関数からポインタを返すのは得策ではありません。問題は、ユーザーがそのメモリを解放する必要があるため、ユーザーと同じメモリ管理機能を使用することを強制していることです。

そのことを念頭に置いて、ここで 2 ビットのメモリを割り当てます。1 つは文字へのポインタ用で、もう 1 つは文字自体用です。

char** p = malloc(sizeof(*p));
*p = malloc(sizeof(**p));
**p = '\0';
return p;

そして、ユーザーがしなければならないことを覚えておいてください:

free(*p);
free(p);

しかし、繰り返しますが、あなたがしていることは良いプログラミングではありません。null ポインターを受け入れる関数を作成することをお勧めします。

于 2012-06-20T08:45:02.083 に答える
0

最初のケースは問題なく、 のような文字列リテラル""は関数から安全に返されます。空の文字列へのポインターを含む長さ 1 の配列が必要な 2 番目のケースでは、いくつかのトリックを行うことができます。

char ** array_empty_if_null(const char **array)
{
  static char *empty[] = { "" };

  return (array == NULL || array[0] == NULL) ? empty : array;
}

これは、必要なものの説明と一致すると思います。

于 2012-06-20T08:49:30.540 に答える
0

null は空のポインターなので、null を返すことはできませんか?

于 2012-06-20T08:38:35.957 に答える
0

その{""}定義で変数を初期化するためにのみ使用できます。式としてではありません。つまり、次のように使用することはできません。

char* temp[1];
temp = {""}; // invalid
于 2012-06-20T08:42:38.727 に答える