Restituendo NULL se l'inizializzazione della struttura non è riuscita in C?

Restituendo NULL se l'inizializzazione della struttura non è riuscita in C?
 if( mystruct == NULL )

mystruct non è un puntatore, quindi non puoi confrontarlo con NULL .

Hai tre opzioni:

  1. Aggiungi un campo di stato a MyStruct per indicare se la struttura è stata inizializzata correttamente.
  2. Assegna la struttura all'heap e restituiscila tramite un puntatore.
  3. Passa la struttura come argomento del puntatore e restituisce un codice di stato (grazie @Potatoswatter).

Una struttura non è un puntatore. Se vuoi essere in grado di restituire NULL, dovrai allocare la struttura sull'heap in modo da poter restituire un puntatore ad essa e lasciare che il chiamante ripulisca in seguito.

In questo modo, puoi indicare un errore, qualcosa come:

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;
}

NULL può essere utilizzato se una funzione restituisce un puntatore . In questo caso, restituisci un oggetto, il che significa che devi restituire un oggetto reale, esistente.

Un modo per farlo è avere un campo "ok" nella struttura che puoi impostare nella funzione init e che puoi archiviare nel chiamante.

Un altro modo è riscrivere il codice in modo da allocare una struttura dinamicamente e restituire un puntatore, in questo modo è possibile restituire NULL in caso di errore. (Nota, tuttavia, che ci sono altri inconvenienti nell'allocare le cose in modo dinamico.)