2012-05-18 10 views
9

私はこのCコードを持っている:Cで構造体の初期化に失敗した場合はNULLを返しますか?

#include<stdio.h> 

typedef struct { 
    int foo; 
} MyStruct; 

MyStruct init_mystruct(void); 

int main(void) { 

    MyStruct mystruct = init_mystruct(); 

    if(mystruct == NULL) { 
     /* error handler */ 
    } 

    return(0); 
} 

MyStruct init_mystruct(void) { 

    MyStruct mystruct; 
    int is_ok = 1; 

    /* 
    * do something ... 
    */ 

    /* everything is OK */ 
    if(is_ok) 
     return mystruct; 
    /* something went wrong */ 
    else 
     return NULL; 
} 

それは、その構造体を初期化するための構造と機能を持っています。私がしようとしているのは、その関数に失敗があった場合にNULLを返すことです。

gccのエラーメッセージ:

code.c: In function ‘main’: 
code.c:13: error: invalid operands to binary == (have ‘MyStruct’ and ‘void *’) 
code.c: In function ‘init_mystruct’: 
code.c:34: error: incompatible types when returning type ‘void *’ but ‘MyStruct’ was expected 

それはNULLではなく構造返すことは有効ではないということになりますので、どのように私はこのケース(無構造体へのポインタ)で構造の初期化が失敗したことを表現していますか?

答えて

12
if(mystruct == NULL) 

mystructあなただけNULLとそれを比較することはできませんポインタではありません。

あなたは3匹のオプションがあります。

  1. は、構造体が正しく初期化されているかどうかを示すためにMyStructにステータスフィールドを追加します。
  2. ヒープに構造体を割り当て、ポインタで返します。
  3. 構造体をポインタ引数として渡し、ステータスコードを返す(thanks @ Potatoswatter)。
+1

そのように、あなたは失敗、のようなものを示すことができます。これにより、システムは行動を起こして再試行することができます。 –

0

Alsが指摘したように、mystructはポインタではないため、比較は意味を意味しません。

あなたがいずれかを実行する必要があります:

をa)の動的構造体を割り当てて、成功したことを返します。 )それ以外の場合に無料でヌル

又は

Bを返す構造にエラーフラグを含み、それをテストします。

1

NULLは、関数がポインタを返す場合に使用できます。この場合、オブジェクトを返します。つまり、実際の既存のオブジェクトを返す必要があります。

これを行う1つの方法は、init関数で設定できる構造体に "ok"フィールドを置き、呼び出し元をチェックインできるようにすることです。

もう一つの方法は、構造体を動的に割り当ててポインタを返すようにコードを書き直し、失敗した場合にNULLを返すことができるようにすることです。ただし、物事を動的に割り当てる他の欠点があることに注意してください。

3

構造体はポインタではありません。 NULLを返すことができるようにするには、ヒープに構造体を割り当ててポインタを返す必要があり、その後呼び出し元をクリーンアップする必要があります。あなたはフラグが何が悪かったのかを示すために、得ることができる - あなたも、ブールフラグよりも良い行うことができます

MyStruct *init_mystruct (void) { 
    MyStruct *mystruct = malloc (sizeof (*mystruct)); 
    if (mystruct != NULL) 
     return NULL; 

    int is_ok = 1; 
    /* do something ... */ 

    /* everything is OK */ 
    if(is_ok) 
     return mystruct; 

    /* something went wrong */ 

    free (mystruct); 
    return NULL; 
} 

int main (void) { 
    MyStruct *mystruct = init_mystruct(); 

    if (mystruct == NULL) { 
     /* error handler */ 
     return -1; 
    } 

    free (mystruct); 

    return 0; 
} 
関連する問題