Retourner NULL si échec de l'initialisation de la structure en C?
J'ai ce code 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;
}
Il a une structure et une fonction pour initialiser cette structure. Ce que j'essaie de faire est de retourner la valeur NULL si il y a une défaillance dans cette fonction.
La gcc message d'erreur :
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
Il semble que de retourner la valeur NULL au lieu d'une structure n'est pas valide, alors comment puis-je exprimer l'insuffisance de structures d'initialisation dans ce cas (pas de pointeur de structure)?
OriginalL'auteur | 2012-05-18
Vous devez vous connecter pour publier un commentaire.
mystruct
n'est pas un pointeur que vous ne peut tout simplement pas comparer avecNULL
.Vous disposez de trois options:
MyStruct
pour indiquer si la structure a été initialisé correctement.OriginalL'auteur NPE
Une structure n'est pas un pointeur. Si vous voulez être en mesure de retourner la valeur NULL, vous allez avoir à allouer la structure sur le tas de sorte que vous pouvez retourner un pointeur vers elle, et l'appelant de nettoyer après.
De cette façon, vous pouvez indiquer l'échec, quelque chose comme:
OriginalL'auteur paxdiablo
NULL
peut être utilisée si une fonction retourne une pointeur. Dans ce cas, vous retourner un objet, ce qui signifie que vous avez à rendre un réel, un objet existant.Une façon de le faire est d'avoir un "ok" dans la structure que vous pourriez placer dans la fonction init, et que vous pouvez vérifier en l'appelant.
Une autre façon consiste à réécrire votre code afin que vous allouer une structure dynamique et retourner un pointeur, de cette façon, vous pouvez retourner la valeur NULL en cas d'échec. (Notez, cependant, qu'il y a d'autres inconvénients de l'allocation des choses de façon dynamique.)
OriginalL'auteur Lindydancer
Que la Sla a souligné, mystruct n'est pas un pointeur et donc la comparaison ne signifie pas de sens.
Que vous avez à faire:
a) allouer Dynamiquement de la structure et de retour que sur la réussite. Sinon, libre et retourner la valeur null
ou
b) d'Inclure dans la structure d'un indicateur d'erreur et de le tester.
OriginalL'auteur Ed Heal