malloc del puntatore alla struttura funziona perché?

In un codice che ho usato per errore

list* Head = malloc(sizeof(list*)); 

invece del corretto

  list* Head = malloc(sizeof(list)); 

per creare un nuovo nodo di tipo list ma ha funzionato bene in seguito.

Quindi la mia domanda è: perché ha funzionato correttamente?

    L’idea qui è, malloc() non ha idea (tipo / dimensione) o relazione alla variabile a cui verrà assegnato il valore di ritorno. Accetta l’argomento di input, alloca la memoria della dimensione richiesta e restituisce un puntatore al blocco di memoria, il gioco è fatto. Quindi, nel caso in cui hai richiesto una dimensione errata del blocco di memoria, malloc() non ha nulla per impedirti di farlo. Una volta che usi il puntatore restituito, lo sarai

    • sprecare memoria, quando la dimensione allocata è più che necessaria per il tipo di destinazione.
    • causa un comportamento indefinito accedendo alla memoria esaurita, quando la dimensione richiesta è inferiore a quella richiesta per tipo di destinazione.

    Ora, in entrambi i casi, potresti vederlo funzionare correttamente . Il primo è in qualche modo ammissibile (anche se dovrebbe essere evitato) ma il dopo è un rigoroso no-go.


    Parola di consiglio:

    Per evitare questo tipo di errori, utilizzare il formato

      type * variable = malloc(sizeof *variable); 

    in tal caso, hai due vantaggi,

    1. La tua dichiarazione è disaccoppiata con il tipo di variabile.
    2. Le possibilità di digitare erroneamente la dimensione richiesta sono minori.