Obtendo uma exceção de estouro de pilha ao declarar uma matriz grande

O código a seguir está gerando um erro de estouro de pilha para mim

int main(int argc, char* argv[]) { int sieve[2000000]; return 0; } 

Como faço para contornar isso? Estou usando o Turbo C ++, mas gostaria de manter meu código em C

EDITAR:

Obrigado pelo conselho. O código acima foi apenas por exemplo, eu realmente declaro o array em uma function e não em sub main. Além disso, eu precisava que o array fosse inicializado em zeros, então quando eu pesquisei no malloc, descobri que o calloc era perfeito para os meus propósitos.

O Malloc / calloc também tem a vantagem sobre a alocação na pilha de permitir que eu declare o tamanho usando uma variável.

Seu array é grande demais para caber na pilha, considere usar o heap:

 int *sieve = malloc(2000000 * sizeof(*sieve)); 

Se você realmente quiser alterar o tamanho da pilha, dê uma olhada neste documento.

Dica : – Não se esqueça de liberar sua memory alocada dinamicamente quando não for mais necessária.

Existem 3 maneiras:

  1. Alocar matriz na pilha – use malloc() , como outros pôsteres sugeridos. Não se esqueça de free() (embora para main() não seja tão importante – o sistema operacional irá limpar a memory para você na finalização do programa).
  2. Declare a matriz no nível da unidade – ela será alocada no segmento de dados e visível para todos (adicionar static à declaração limitará a visibilidade à unidade).
  3. Declare sua matriz como static – nesse caso, ela será alocada no segmento de dados, mas visível somente em main() .

Você seria melhor alocá-lo na pilha, não na pilha. algo como

 int main(int argc, char* argv[]) { int * sieve; sieve = malloc(20000); return 0; } 

Isso é cerca de 7MB de espaço na pilha. No visual studio, você usaria / STACK: ###, ### para refletir o tamanho desejado. Se você realmente quer uma pilha enorme (pode ser um bom motivo, usando LISP ou algo assim :), até mesmo o heap é limitado a alocações smallhh antes de forçar você a usar VirtualAlloc), você também pode querer configurar seu PE para construir com / LARGEADDRESSAAWARE (linker do Visual Studio novamente), mas esta configuração é seu header PE para permitir que o seu binário compilado resolva o total de 4 GB de espaço de endereço de 32’bit (se estiver rodando em um WOW64). Se construir binários verdadeiramente massivos, você também precisaria configurar o / bigobj como um parâmetro de linker adicional.

E se você ainda precisar de mais espaço, você pode violar radicalmente a convenção usando algo semelhante a (novamente link do MSVC) / merge :, que permitirá que você empacote uma seção em outra, para que você possa usar cada byte para um único código compartilhado / seção de dados. Naturalmente, você também precisaria configurar as permissions SECTIONS em um arquivo def ou com #pgrama.

Use malloc. Tudo verifique se o tipo de retorno não é nulo, se é nulo, então o seu sistema simplesmente não tem memory suficiente para caber em muitos valores.

Existe alguma razão pela qual você não pode usar alloca () para alocar o espaço que você precisa no quadro de pilha com base em quão grande o object realmente precisa ser?

Se você fizer isso e ainda estourar a pilha, coloque-a no heap alocado. Eu recomendo não declará-lo como estático em main () e colocá-lo no segmento de dados.

Se realmente tem que ser tão grande e seu programa não pode alocá-lo no heap, seu programa realmente não tem nenhum negócio funcionando com esse tipo de máquina para começar.

O que exatamente você está tentando realizar?

Sua matriz é enorme.

É possível que sua máquina ou sistema operacional não tenha ou deseje alocar tanta memory.


Se você realmente precisa de um array enorme, você pode tentar alocá-lo dinamicamente (usando malloc(...) ), mas você corre o risco de vazar memory. Não esqueça de liberar a memory.

A vantagem do malloc é que ele tenta alocar memory no heap em vez da pilha (portanto, você não obterá um estouro de pilha).

Você pode verificar o valor que malloc retorna para ver se a alocação foi bem-sucedida ou falhou. Se falhar, apenas tente malloc uma matriz menor.


Outra opção seria usar uma estrutura de dados diferente que possa ser redimensionada rapidamente (como uma lista encadeada). Se esta opção for boa depende do que você vai fazer com os dados.

Ainda outra opção seria armazenar as coisas em um arquivo, streaming de dados em tempo real. Essa abordagem é a mais lenta.

Se você vai para armazenamento no disco rígido, você também pode usar uma biblioteca existente (para bancos de dados)

Como o Turbo C / C ++ é um tipo de dados do compilador de 16 bits, consome cerca de 2 bytes. 2bytes * 2000000 = 40,00,000 bytes = 3,8147MB de espaço.

As variables ​​automáticas de uma function são armazenadas na pilha e causam o estouro da memory da pilha. Em vez disso, use a memory de dados [usando variables ​​estáticas ou globais] ou a memory de heap dynamic [usando o malloc / calloc] para criar a memory necessária, conforme a disponibilidade do mapeamento de memory do processador.

Use malloc vez disso. Sintaxe:

 newnode=(struct node *)malloc(sizeof(struct node)) 
Intereting Posts