Por que um grande array local falha meu programa, mas um global não?

Programa com grande matriz global:

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

Programa com grande matriz local:

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

Quando eu declaro um array com tamanho grande na function main, o programa trava com “SIGSEGV (falha de segmentação)”.

No entanto, quando o declaro como global, tudo funciona bem. Por que é que?

Declarar o array globalmente faz com que o compilador inclua o espaço para o array na seção de dados do binário compilado. Nesse caso, você aumentou o tamanho do binário em 8 MB (2000000 * 4 bytes por int). No entanto, isso significa que a memory está sempre disponível e não precisa ser alocada na pilha ou no heap.

EDIT: @ Blue Moon corretamente aponta que uma matriz não inicializada provavelmente será alocada no segmento de dados bss e pode, na verdade, ocupar nenhum espaço em disco adicional. Uma matriz inicializada será alocada estaticamente.

Quando você declara uma matriz tão grande em seu programa, você provavelmente excedeu o tamanho da pilha do programa (e, ironicamente, causou um estouro de pilha ).

Uma maneira melhor de alocar um array grande dinamicamente é usar um ponteiro e alocar a memory no heap da seguinte forma:

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

Um bom tutorial sobre o layout de memory dos programas em C pode ser encontrado aqui .

Intereting Posts