Nel linguaggio C, le variabili con area di allocazione automatica (auto, per impostazione predefinita) vengono create nello stack all'ingresso nell'area della loro visibilità (di solito, la funzione) e vengono automaticamente distrutte all'uscita da essa.
Le caratteristiche includono:
Esempio di utilizzo corretto e scorretto:
int* wrong() { int x = 42; return &x; // ERRORE: x verrà distrutto dopo l'uscita dalla funzione } void correct() { int y = 123; printf("%d\n", y); // tutto bene }
Cosa succede se restituisci l'indirizzo di una variabile locale dalla funzione?
Risposta errata comune: «Il puntatore manterrà il valore».
Risposta corretta: L'indirizzo restituito diventerà non valido dopo l'uscita dalla funzione, l'area di memoria verrà nuovamente allocata per altre variabili automatiche o funzioni. Utilizzare tale puntatore comporta un comportamento indefinito.
Esempio:
int* myfunc() { int temp = 10; return &temp; // temp viene distrutto dopo il ritorno } int main() { int* p = myfunc(); printf("%d\n", *p); // COMPORTAMENTO INDEFINITO }
Storia
Storia
Storia
Nel firmware di un registratore medico era stato implementato un cache nello stack per accelerare l'elaborazione dei dati. Sotto carico, lo stack traboccava, portando al riavvio del dispositivo e alla perdita di dati sui pazienti.