? Um estouro de pilha é um tipo de erro de programação que ocorre quando um programa tenta alocar mais memória na pilha de chamadas do que está disponível. É um erro potencialmente grave que faz com que o programa ofensivo para bater e, geralmente, é o resultado de um de dois erros de projeto. O Stack
A pilha refere-se a uma seção de memória que é usado para armazenar informações sobre as funções de um programa. Os tamanhos e detalhes técnicos da pilha será variar de acordo com a linguagem de programação , compilador, sistema operacional e tipo de processador, e esses detalhes são geralmente escondida do programador na maioria das linguagens de alto nível.
Exemplo
Stack
Considere o seguinte exemplo em pseudocódigo :
funcionar a { 1. chamar função b.2 . chamar a função c . }
função b {1 . chamar função c.2 . Imprimir Spot. }
Função c {1 . Tiragem . }
Como cada função pode chamar outras funções , existe a pilha para manter o controle de onde na função de pai para continuar depois de função uma criança retorna. Este exemplo, se parou dentro da função c , pode ter uma pilha que é algo como isto:
> A1 ---> B1 --------> C1
Desde a primeira linha da função A chama a função B, ea primeira linha da função B chama a função C. Após função C vai terminar , o programa vai continuar de volta para a cadeia , correndo B2 e finalmente A2.
Recursão Infinita
um estouro de pilha ocorre quando um programa tenta armazenar muita informação na pilha. A causa mais comum de um estouro de pilha é um erro de design chamado recursão infinita . Considere o seguinte exemplo em pseudocódigo :
função A { 1. chamar a função A. }
E a pilha resultante :
-> A1 ---> A1 --------> A1 ------- -------> A1 (e assim por diante)
Aqueles familiarizados com programação de computador vai reconhecer isso como uma variação do loop infinito , a não ser , em vez de correr para sempre , este programa irá eventualmente consumir todo a memória na pilha , resultando em um acidente e um erro de estouro de pilha.
Prevenção
erros de estouro de pilha geralmente ocorrem quando se tenta implementar algoritmos recursivos , ea chave para evitar a maioria dos erros é garantir que o seguinte é verdadeiro para todas as implementações recursivas : a função recursiva deve conter uma condição de saída que não crie outra camada de recursão , ea função recursiva deve ser concebido de modo que cada camada de recursão adicionado deve trazer a função mais próxima da condição de saída .
grandes variáveis locais
Outra causa muito mais raros de erros de estouro de pilha é a declaração de grandes variáveis locais , geralmente sob a forma de matrizes contendo centenas de milhares, ou milhões , de elementos . A maneira mais simples para evitar estouros de pilha nesta situação é a utilização de ponteiros e alocação dinâmica de memória para evitar declarar os dados na pilha quando tais operações intensivas de memória são chamados.