Alocação de Memória
Artigo: Alocação de Memória. Pesquise 862.000+ trabalhos acadêmicosPor: rksm • 25/11/2013 • Artigo • 988 Palavras (4 Páginas) • 239 Visualizações
Alocação de Memória
Todo programa precisa utilizar memória para ser executado. Quando um programa inicia sua execução, ele começa a solicitar memória ao sistema operacional, ou seja, faz a alocação de memória necessária para a sua execução. Nem sempre a memória alocada na iniciação do programa é suficiente, então o programa também precisa alocar memória durante a sua execução.
A linguagem C permite dois tipos de alocação de memória: Alocação estática e alocação dinâmica.
Alocação Estática de Memória
Na alocação estática o espaço de memória, que as variáveis irão utilizar durante a execução do programa, é definido no processo de compilação. Não sendo possível alterar o tamanho desse espaço durante a execução do programa.
Exemplos:
/*Espaço reservado para um valor do tipo char. O char ocupa 1 byte na memória.*/
char a;
/*Espaço reservado para dez valores do tipo int. O int ocupa 4 bytes na memória, portanto 4x10=40 bytes.*/
int vetor[10];
/*Espaço reservado para nove(3x3) valores do tipo double. O double ocupa 8 bytes na memória, portanto 3x3x8=72 bytes.*/
double matriz[3][3];
Este tipo de alocação é utilizado quando se sabe de antemão a quantidade de memória que será utilizada pelo programa.
Alocação Dinâmica de Memória
Na alocação dinâmica o espaço de memória, que as variáveis irão utilizar durante a execução do programa, é definido enquanto o programa está em execução. Ou seja, quando não se sabe ao certo quanto de memória será necessário para o armazenamento das informações, podendo ser determinadas, sob demanda, em tempo de execução conforme a necessidade do programa.
No padrão C ANSI existem quatro funções para alocação dinâmica de memória:
1. malloc()
2. calloc()
3. realloc()
4. free()
Todas elas pertencem a biblioteca <stdlib.h>. Iremos nos concentrar nas funções malloc() e free(), pois são as mais utilizadas.
Sintaxe da função malloc():
void *malloc(size_t num_bytes);
Esta função recebe como parâmetro "num_bytes" que é o número de bytes de memória que se deseja alocar. O tipo size_t é definido em stdlib.h como sendo um inteiro sem sinal. O interessante é que esta função retorna um ponteiro do tipo void podendo assim ser atribuído a qualquer tipo de ponteiro.
Exmeplo:
int *vetor;
vetor = malloc(100);
No exemplo acima foram alocados, dinamicamente, cem bytes da memória Heap. Quando os programas alocam memória dinamicamente, a biblioteca de execução C recebe memória a partir de um reservatório de memória livre (não utilizado) chamado Heap.
A função malloc() devolve um ponteiro do tipo void, desta forma pode-se atribuí-lo a qualquer tipo de ponteiro. Portanto, precisamos fazer uma conversão (cast) para o tipo desejado e também alocar um espaço compatível com o tipo de destino. A alocação para atender a essas necessidades deve ser feita desta forma:
vetor = (int *) malloc (100*sizeof(int));
Como a memória ocupada por um determinado tipo pode variar de máquina para máquina, devemos utilizar o operador sizeof, que retorna o tamanho do parâmetro informado.
Como foi descrito anteriormente, a memória alocada é obtida da memória Heap. Contudo, não há garantias de que a Heap possua memória disponível para o seu programa. Portanto, é necessário verificar se existe espaço suficiente na Heap para alocar a memória desejada. Para atender a este requisito, devemos fazer um teste para verificar se a memória foi realmente alocada.
Exemplo:
vetor = (int *) malloc (100*sizeof(int));
if (vetor == NULL){
printf ("Não há memória suficiente para alocação");
exit(1);
}
Quando a função malloc não consegue alocar memória, pois não há espaço suficiente na Heap, a mesma retorna NULL, indicando que a requisição de memória foi negada. Quando a alocação é feita com sucesso, malloc retorna um ponteiro para a região de memória alocada.
Sintaxe da função free():
void free
...