4

成功した場合にメモリ内のデータへのポインタを返す関数を作成するように依頼されたことがあります。この場合、正しい戻り値の型は何でしょうか。データのみを返す必要がある場合は、関数 myfunction の戻り値の型として char * を使用します。ただし、この場合、戻り値の型が -1 になることがあります。

<what-type> myfunction() {

char *data;

if (some condition true)
  return data;
else 
  return -1
}

int main () {

 myfunction

}
4

5 に答える 5

7

を使用unionし、おそらく定義しますtypedef

すなわち

typedef struct {
   int is_error;
   union {
     int error_code;
     char *data;
   }
} ReturnType;

それで

ReturnType myFunction(....) { ... etc }

呼び出し元は、関数がエラーかどうかを確認するか (戻りエラー コードを取得)、dataそうでない場合に取得できます。

于 2013-05-23T03:33:10.527 に答える
4

異なるデータ型を返したい場合は、次を使用しvoid*ます。

void* myfunction();
^^^^^

あなたの場合、を返すNULLことは、よりも理想的な解決策のよう-1です。
関数のユーザーが次のようなコードを記述できるようになります。

if(myfunction())
{
    //Utilize the returned string
}
于 2013-05-23T03:20:37.893 に答える
0

ポインターを返す関数..成功した場合、それ以外の場合は「-1」を返す必要があります。

エラー表示と関数結果をそのような 1 つのオブジェクトに混在させないでください。関数がブール値の成功インジケーターのみを返すようにすることで、それらを 2 つの異なるエンティティに分割し、次のようなポインターを介して実際の結果データを返します。

bool myfunction(char **result_ptr) {
        char *data;

        if (some error condition)
                return false;

        *result_ptr = data;
        return true;
}

int main () {
        bool success;
        char *data:

        success = myfunction(&data);
        if (success)
                use(data);

}

インバンド エラー インジケーターは、多くの場合失敗を招く貧弱な API を作成し (realloc関数の極端なケースでは、失敗した場合に元のポインターを失うコードを記述する必要があります)、少なくとも次の点で失敗します優れた API の特徴

  • ドキュメントがなくても使いやすい
  • 誤用しにくい
  • それを使用するコードを読みやすく、保守しやすい

CERTは、セキュリティの観点からそれらを推奨していません。

于 2016-06-26T15:01:16.467 に答える
-1

NULL を使用しない場合は、戻り値を型キャストできます

char* myfuntion(){  
                return (char*)-1;
}
int main () {
 printf("%d",myfuntion());
}
于 2013-05-23T07:29:05.127 に答える