Heap Memory in C Programming

O que é exactamente memória de pilha?

sempre que uma chamada para malloc é feita, a memória é atribuída a partir de algo chamado de heap. Onde exactamente está o heap. Eu sei que um programa na memória principal é dividido em segmento de instrução onde as instruções do programa são presentes, segmento de dados onde os dados globais residem e stack segmento onde as variáveis locais e os parâmetros de função correspondentes são armazenados. E o heap?

Author: Mateusz Piotrowski, 2012-04-18

4 answers

O heap faz parte do espaço de endereçamento do seu processo. O heap pode ser cultivado ou encolhido; você o manipula chamando brk(2) ou sbrk(2). Isto é de facto o que malloc(3) faz.

A alocação do heap é mais conveniente do que a alocação da memória na pilha porque persiste após os retornos da rotina de chamada; assim, você pode chamar uma rotina, digamos funcA(), para alocar um monte de memória e preenchê-la com alguma coisa; essa memória ainda será válida depois dos retornos de funcA(). Se funcA() atribuir a a lista local (na pilha) então, quando funcA() retorna, a lista de 'on-stack' desaparece.

Uma desvantagem de usar o heap é que se você se esquecer de liberar memória heap-alocado, você pode esgotá-lo. A falha em liberar memória alocada por heap (por exemplo, falhar em memória obtida de free()) é às vezes chamada de fuga de memória .

Outra boa característica do heap, vs. apenas a atribuição de um array/struct/o que quer que esteja na pilha, é que você obtém um valor de retorno dizendo Se a sua alocação foi bem sucedida; se você tentar alocar uma matriz local na pilha e você terminar, você não obtém um código de erro; tipicamente o seu tópico será simplesmente abortado.

 8
Author: collin, 2012-04-18 05:22:17

Basicamente, depois da Memória ser consumida pelas necessidades dos programas, o que resta é o Monte. Em C que será a memória disponível para o computador, para máquinas virtuais será menos do que isso.

Mas, esta é a memória que pode ser usada em tempo de execução, pois o seu programa precisa de memória dinamicamente.

Você pode querer olhar para isto para mais informações:

Http://computer.howstuffworks.com/c28.htm

 2
Author: James Black, 2012-04-17 23:29:17

O Monte é o oposto diametralmente oposto da pilha. O heap é uma grande piscina de memória que pode ser usado dinamicamente – também é conhecido como a "loja livre". Esta é a memória que não é gerenciada automaticamente-você tem que alocar explicitamente (usando funções como malloc), e desalocate (por exemplo, livre) a memória. A falha em liberar a memória quando você terminar com ela resultará no que é conhecido como uma fuga de memória-memória que ainda está "sendo usada", e não disponível para outros processo. Ao contrário da pilha, geralmente não há restrições sobre o tamanho do heap (ou as variáveis que ele cria), além do tamanho físico da memória na máquina. Variáveis criadas no heap são acessíveis em qualquer lugar do programa.

E a memória do heap requer que uses ponteiros.

Um resumo do Monte:

  • o heap é gerido pelo programador, a capacidade de modificá-lo é um pouco sem limites
  • Em C, as variáveis são atribuídas e libertadas usando funções como malloc () e free ()
  • o Monte é grande, e é geralmente limitado pela memória física disponível
  • o heap requer ponteiros para aceder a ele

Crédito ao código craftof

 2
Author: yehuda corsia, 2018-01-20 20:39:14

Ao ler isto, isto está realmente para além dos reinos de C. C, não especifica que existe um heap atrás de malloc; poderia ser facilmente chamado de lista de ligações ; Você está apenas a chamar-lhe um heap por convenção.

O que o padrão garante é que malloc irá devolver um ponteiro a um objecto que tem duração dinâmica de armazenamento, e o seu heap é apenas um tipo de estrutura de dados que facilita o fornecimento desse tipo de Duração do armazenamento. É a escolha comum. No entanto, os próprios programadores que escreveram o seu heap reconheceram que pode não ser um heap, pelo que não verá nenhuma referência do termo heap em o manual POSIX malloc por exemplo.

Outras coisas que estão além dos reinos da norma C incluem tais detalhes do Código da máquina binário que já não é o código fonte C após a compilação. Os detalhes do layout, embora típicos, são todos implementação-específica em vez de C-específica.

O heap, ou o que guarda de livros é usado para contabilizar as atribuições, é gerado durante o tempo de execução; como malloc é chamado, novos itens são (presumivelmente) adicionados a ele e como free é chamado, novos itens são (novamente, presumivelmente) removidos dele.

Como resultado, geralmente não há necessidade de ter uma seção no código binário da máquina para objetos alocados usando {[[0]}, no entanto há casos em que as aplicações são enviadas de forma autônoma cozido em microprocessadores, e em alguns destes casos você pode encontrar que flash ou de outra forma memória não-volátil pode ser reservado para esse uso.
 0
Author: autistic, 2018-01-20 21:52:58