4

このコードを考えてみましょう:

typedef struct fruits_s
{
    char* key;
    char value;
} fruits_t;

static fruits_t fruit_array[] = {
{ "Apple", 1 },
{ "Banana", 2 },
{ "Grape", 3 },
{ "Orange", 4 } };

static fruits_t* getFruitFromValue(char value)
{
    int i;
    for (i = 0; i < sizeof(fruit_array)/sizeof(fruit_array[0]); i++){
        if (value == fruit_array[i].value){
            return fruit_array[i];
        }
    }
}

私はCを初めて使用し、ポインターが必要/使用されるタイミングをまだ学習しています。私はJavaのバックグラウンドから甘やかされています。したがって、上記のコードで私が混乱しているのは、関数がポインター fruits_t*を返す必要があるということです。または、他の何か?私がそうするときfruit_array[i]、それは私の構造体へのポインタですか、それとも構造体自体ですか?

そうは言っても、コードの後半で関数を使用したいときは、次のようになります。

 fruits_t* temp = getFruitFromValue(1);

また

 fruits_t temp = getFruitFromValue(1);

また

 fruits_t temp = &getFruitFromValue(1);
4

1 に答える 1

4

関数はどちらかを返す可能性があります—あなたの選択。ポインタを返すと言っています。あなたがそうする限り、それは大丈夫です。

あなたが書くとき:

static fruits_t *getFruitFromValue(char value)
{
    int i;
    for (i = 0; i < sizeof(fruit_array)/sizeof(fruit_array[0]); i++){
        if (value == fruit_array[i].value){
            return fruit_array[i];
        }
    }
}

いくつかの問題があります:

  1. fruit_array[i]は構造体であり、ポインタではありません。を使用しreturn &fruit_array[i];ます。
  2. ループが終了した場合、関数から値を返すことはありません。

それらを修正すると、次のようになります。

static fruits_t *getFruitFromValue(char value)
{
    int i;
    for (i = 0; i < sizeof(fruit_array)/sizeof(fruit_array[0]); i++)
    {
        if (value == fruit_array[i].value)
            return &fruit_array[i];
    }
    return NULL;
}

返されるポインタは、関数よりも長持ちする静的データへのポインタであるため、これは問題ありません。非静的データへのポインタを返そうとした場合、(malloc()et alを介して)動的メモリ割り当てを使用しない限り、(おそらく)手にバグがあります。

構造を返すこともできます。エラーリターンの処理が難しくなります。C99をお持ちの場合は、「複合リテラル」を使用できます。

static fruits_t getFruitFromValue(char value)
{
    int i;
    for (i = 0; i < sizeof(fruit_array)/sizeof(fruit_array[0]); i++)
    {
        if (value == fruit_array[i].value)
            return fruit_array[i];
    }
    return (fruits_t){ .key = "", .value = 0 };
}
于 2012-11-20T01:38:13.190 に答える