Alocação dinâmica

A alocação dinâmica é o processo que aloca memória em tempo de execução. Ela é utilizada quando não se sabe ao certo quanto de memória será necessário para o armazenamento das informações, podendo ser determinadas em tempo de execução conforme a necessidade do programa. Dessa forma evita-se o desperdício de memória.

[ Hits: 30.548 ]

Por: Daniel Gurgel Pinheiro em 02/11/2006


Veja programa como exemplo



#include <stdio.h>
#include <stdlib.h>

main()
{
   int *a;  
   int n;  
   printf("Quantos números quer ordenar? ");
   scanf("%d", &n);
   a = (int *) malloc( n * sizeof(int) );
   if( a == NULL )
   {
      printf("Erro: não há memória\n");
      exit(1);
   }
   /* código para introduzir um array de n números e ordená-los */
   ...
   free( a );
}

Em vez de declaramos a variável a como sendo um array de inteiros, declaramos a como sendo um apontador para um inteiro. A idéia é que a vai ser o endereço do primeiro elemento do array.

Concentrem-se na linha do programa que tem o malloc. A linha tem um aspecto feio mas não é nada de complicado.

      a = (int *) malloc( n * sizeof(int) );

A função malloc tem um argumento que é o número de bytes de memória que pretendemos utilizar. Se quisermos guardar n inteiros temos de pedir n vezes o número de bytes que cada inteiro ocupa.

O número de bytes que cada inteiro ocupa é dado por sizeof(int) No caso geral, sizeof(T) dá o número de bytes que uma variável do tipo T ocupa.

Aquilo que o malloc retorna é o endereço do primeiro byte do bloco de memória que foi pedido. Caso não haja memória, o malloc retorna NULL.

O (int *) que aparece antes do malloc é necessário porque a variável a é um apontador para inteiro. No caso geral, se quisermos alocar memória para um array de n elementos de um tipo T temos de fazer assim:

      T *a;
      a = (T *) malloc( n * sizeof(T) );

Bibliografia


DEL - Departamento de Engenharia Eletrônica e de Computação da Escola Politécnica da UFRJ
http://www.gta.ufrj.br/~celio/classes/eel670/referencias.html

Curso da Engenharia Elétrica da UFMG
http://ead1.eee.ufmg.br/cursos/C/

Página anterior    

Páginas do artigo
   1. Visão mais detalhada da memória do computador
   2. E os arrays? Como é que são guardados?
   3. Alocação dinâmica de memória
   4. Veja programa como exemplo
Outros artigos deste autor

Acessando a porta paralela via Linux

Leitura recomendada

Programação de Jogos com SDL

O Produtor e o Consumidor

Desenvolvendo aplicativo para autenticação biométrica utilizando a Libfprint

SDL - Ótimo para criação de jogos

Android NDK: Desmistificando o acesso a códigos nativos em C

  
Comentários
[1] Comentário enviado por tuxSoares em 02/11/2006 - 10:31h

Não entendi muita coisa mais tá de parabéns! Continue ajudando nossa comunidade, artigos como o seu são impressindiveis para o desenvolvimento intelectual de quem deseja aprender.

Vlw :)

[2] Comentário enviado por Reideer em 02/11/2006 - 10:47h

?
e como ficam lista e fila nesta historia?
acredito que tenha muitos metodos para alocação dinâmica.

[3] Comentário enviado por AboutDiego em 02/11/2006 - 23:34h

Vale ressaltar que dependendo do seu compilador pode também possuir o arquivo oculo malloc.h, tem o mesmo efeito que stdlib.h na hora da alocação dinâmica só muda em que na parte onde você coloca p=(int*)malloc, você colocará p=(int*)calloc

Obs: Somente para abrir um pouco mais o leque ^^. falouz

[4] Comentário enviado por balani em 03/11/2006 - 20:58h

Interessante, eu só não entendi ainda onde usar.

[5] Comentário enviado por AboutDiego em 04/11/2006 - 00:15h

Como utilizar o alocamento de memória ou como utilizar o documento??

[6] Comentário enviado por glaudiston em 30/07/2007 - 14:21h

Um exemplo prático seria quando vc quer ler um arquivo e não sabe o tamanho dele... pode ser gigantesco ou minúsculo.
Outros exemplos inclusive de controle de arrays multidimensionais seguem:
http://vergil.chemistry.gatech.edu/resources/programming/c-tutorial/dynamic.html
http://www.lysator.liu.se/c/c-faq/c-2.html

[7] Comentário enviado por juniomundo em 06/11/2010 - 16:53h

Ótimo. Muito obrigado. Está sendo de grande valia.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts