ProgrammazioneSviluppatore C

Spiega la differenza tra stack e heap nel linguaggio C e quando è meglio utilizzare ciascun tipo di memoria?

Supera i colloqui con l'assistente IA Hintsage

Risposta.

Nel linguaggio C, la memoria per le variabili può essere allocata sia nello stack che nell'heap.

  • Stack — alloca memoria automaticamente all'ingresso della funzione e la libera all'uscita. Veloce, ma la quantità di memoria è limitata dalla dimensione dello stack (di solito diversi MB).
  • Heap — alloca memoria dinamicamente tramite malloc, calloc, realloc, e deve essere liberata manualmente tramite free. La quantità di memoria è limitata dalle capacità del sistema, ma l'accesso è più lento e il rilascio deve essere controllato manualmente.

Quando usare lo stack:

  • Per variabili locali, se la loro dimensione è piccola e nota in fase di compilazione.
  • Per argomenti di funzione e piccoli array.

Quando usare l'heap:

  • Quando la dimensione della memoria non è nota in anticipo.
  • Per oggetti grandi o a lungo termine.

Esempio di codice:

// Nello stack int arr[10]; // Nell'heap int* parr = malloc(sizeof(int) * 10); // Non dimenticare di liberare la memoria free(parr);

Domanda trabocchetto.

Perdona: Cosa succede se a un array allocato tramite malloc non viene chiamata la funzione free?

Risposta: Si verifica una perdita di memoria (memory leak). La memoria allocata dinamicamente non verrà liberata automaticamente e, col passare del tempo, questo può portare ad esaurire la memoria dell'applicazione o dell'intero sistema.

Esempio di codice:

void leak() { int* leakArr = malloc(100 * sizeof(int)); // Nessuna chiamata a free(leakArr), la memoria viene persa }

Storia

In un progetto, i programmatori allocavano memoria per una struttura che descriveva la sessione utente tramite malloc, ma si dimenticavano di chiamare free al termine del lavoro con la sessione. Di conseguenza, il progetto perdeva memoria per diversi giorni, e il server "crashava" con un errore di mancanza di memoria. Il problema è stato risolto solo dopo il profiling con Valgrind e la correzione di tutte le chiamate free mancanti.


Storia

Un sviluppatore ha allocato un grande array (fino a 10 MB) nello stack per calcoli temporanei. Su un server con una piccola dimensione dello stack, questo portava a un crash dell'applicazione con un errore di overflow dello stack. Dopo un'analisi, si è reso necessario spostare il buffer nell'heap.


Storia

Uno degli sviluppatori ha deciso di memorizzare lunghe stringhe nello stack, ma la dimensione della stringa era soggettivamente determinata dall'utente. Quando veniva inserita una stringa molto lunga, l'applicazione crashava con un errore di accesso alla memoria. Alla fine, è stata presa la decisione di spostare i dati inseriti nell'heap con un controllo della lunghezza.