如果C中的结构初始化失败,则返回NULL?

10 c struct initialization

我有这个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;
}
Run Code Online (Sandbox Code Playgroud)

它具有初始化该结构的结构和功能.我正在尝试做的是,如果该函数出现故障,则返回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
Run Code Online (Sandbox Code Playgroud)

它看起来返回NULL而不是结构是无效的,那么在这种情况下如何表示结构初始化的失败(没有结构指针)?

NPE*_*NPE 14

 if( mystruct == NULL )
Run Code Online (Sandbox Code Playgroud)

mystruct不是一个指针,你不能只是比较它NULL.

你有三个选择:

  1. 添加状态字段以MyStruct指示结构是否已正确初始化.
  2. 在堆上分配结构并通过指针返回它.
  3. 将结构作为指针参数传递并返回状态代码(感谢@Potatoswatter).

  • 您甚至可以比布尔标志做得更好 - 您可以让标志来指示出了什么问题。这可以使系统采取行动并重试。 (2认同)

pax*_*blo 5

结构体不是指针。如果您希望能够返回 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;
}
Run Code Online (Sandbox Code Playgroud)