我有这个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.
你有三个选择:
MyStruct指示结构是否已正确初始化.结构体不是指针。如果您希望能够返回 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)