NULL zurückgeben, wenn Struktur-Initialisierung fehlgeschlagen in C?
Habe ich diesen C-code :
#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;
}
Es hat eine Struktur und eine Funktion zur Initialisierung der Struktur. Was ich versuche zu tun, ist NULL zurück, wenn es eine Störung in der Funktion.
Den gcc-Fehlermeldung :
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
Sieht es aus, dass die Rückgabe von NULL statt einer Struktur nicht gültig ist, also wie setze ich das Versagen der Strukturen die Initialisierung in diesem Fall (keine Struktur-Zeiger)?
Du musst angemeldet sein, um einen Kommentar abzugeben.
mystruct
ist nicht ein Zeiger können Sie nicht nur vergleichen Sie es mitNULL
.Haben Sie drei Optionen:
MyStruct
um anzugeben, ob die Struktur wurde korrekt initialisiert.Einer Struktur ist nicht ein Zeiger. Wenn Sie möchten, können NULL zurückgeben, sind Sie gehen zu müssen, verteilen Sie die Struktur auf dem heap, so können Sie die Rückgabe einen Zeiger, um es, und lassen Sie den Anrufer reinigen danach.
Diese Weise können Sie angeben, scheitern, so etwas wie:
NULL
können verwendet werden, wenn eine Funktion gibt eine Zeiger. In diesem Fall, Sie gibt ein Objekt zurück, was bedeutet, dass Sie haben, um wieder eine real existierende Objekt.Einen Weg, dies zu tun ist, um eine "ok" - Feld in der Struktur, die Sie in der init-Funktion, und dass Sie überprüfen könnten, in der Anrufer.
Andere Möglichkeit ist zu ändern Sie Ihren code so, dass die, die Sie zuordnen, eine struct dynamisch und gibt einen Zeiger, so könnte man NULL zurück bei einem Fehler. (Beachten Sie jedoch, dass gibt es andere Nachteile, die eine Zuteilung der Dinge dynamisch.)
Als wies darauf hin, mystruct ist nicht ein Zeiger und daher hinkt der Vergleich nicht, dass Sinn.
Haben Sie zu tun, entweder:
a) Dynamisch zuweisen, die Struktur und die Rückgabe bei Erfolg. Ansonsten kostenlos und null
oder
b) Zählen in der Struktur ein Fehler-flag und das testen.