Si ma quindi dovrebbe essere !=0 e non ==0 no ? visto che la assert da errore nel caso in cui la condizione è falsa ! e poi perchè controllare solo per 0 e non per -1, -56 ecc ? supponiamo che io prima di chiamare la funzione controllo che sia new_length >0, o al più maggiore di -GROWING_DELTA, in quel caso non avrei più bisogno di questa condizione giusto ?È giusto una verifica di una postcondizione della tua funzione; ora come ora è impossibile che ciò accada, ma metti che modifichi il codice e salta fuori un percorso "imprevisto" per cui può essere che new_size risulta uguale a zero, con la assert te ne accorgi immediatamente.
Quindi mi conviene usare un puntatore "provvisorio" in questo caso ?Per inciso, non è una buona idea usare la realloc in quella maniera. Se non c'è sufficiente memoria, infatti, la realloc può fallire, restituendo NULL, che viene memorizzato in a->item. Il problema è che quando la realloc fallisce non libera il blocco di memoria che le era stato passato, ma ora che hai sovrascritto a->item non hai più possibilità di liberarlo manualmente.
Finché la reazione alla mancanza di memoria è un assert (che termina il programma) non liberare esplicitamente la memoria non è un grosso problema, ma è sempre bene tenere a mente questa peculiarità della realloc.
Grazie per la risposta.