Perché un grande array locale causa il crash del mio programma, ma uno globale no?

Programma con un grande array globale:

int ar[2000000]; int main() { } 

Programma con un array locale di grandi dimensioni:

 int main() { int ar[2000000]; } 

Quando dichiaro una matrice di grandi dimensioni nella funzione principale, il programma si blocca con “SIGSEGV (errore di segmentazione)”.

Tuttavia, quando lo dichiaro come globale, tutto funziona correttamente. Perché?

La dichiarazione globale della matrice fa sì che il compilatore includa lo spazio per l’array nella sezione dati del file binario compilato. In questo caso è stata aumentata la dimensione binaria di 8 MB (2000000 * 4 byte per int). Tuttavia, ciò significa che la memoria è sempre disponibile e non deve essere allocata nello stack o nell’heap.

EDIT: @Blue Moon sottolinea giustamente che un array non inizializzato verrà probabilmente allocato nel segmento dei dati bss e potrebbe, in effetti, non occupare spazio su disco aggiuntivo. Un array inizializzato verrà assegnato staticamente.

Quando dichiari un array così grande nel tuo programma hai probabilmente superato la dimensione dello stack del programma (e ironicamente hai causato uno stack overflow ).

Un modo migliore per allocare dynamicmente un grande array consiste nell’utilizzare un puntatore e allocare la memoria sull’heap in questo modo:

 using namespace std; int main() { int *ar; ar = malloc(2000000 * sizeof(int)); if (ar != null) { // Do something free(ar); } return 0; } 

Un buon tutorial sul layout di memoria dei programmi C può essere trovato qui .