14

私はこのCコードを持っています:

#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 を返すことは有効ではないようですが、この場合 (構造体ポインターがない) 構造体の初期化の失敗をどのように表現すればよいでしょうか?

4

4 に答える 4

17
 if( mystruct == NULL )

mystructはポインターではないため、 と比較することはできませんNULL

次の 3 つのオプションがあります。

  1. MyStruct構造体が正しく初期化されたかどうかを示すステータス フィールドを追加します。
  2. 構造体をヒープに割り当て、ポインタで返します。
  3. 構造体をポインター引数として渡し、ステータス コードを返します (@Potatoswatter に感謝)。
于 2012-05-18T11:17:32.720 に答える
4

構造体はポインターではありません。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;
}
于 2012-05-18T11:20:30.053 に答える
2

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

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

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

于 2012-05-18T11:19:59.690 に答える
0

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

次のいずれかを行う必要があります。

a) 構造体を動的に割り当て、成功時にそれを返します。それ以外の場合は解放して null を返す

また

b) 構造体にエラー フラグを含め、それをテストします。

于 2012-05-18T11:19:07.693 に答える