Olá galera, hoje mostrarei como funciona a alocação dinâmica de memória, em primeiro momento vamos entender a diferença da alocação estática para a dinâmica, basicamente a alocação estática é realizada antes do programa começar a ser executado, segue alguns exemplos de alocação estática:
int idade;
char nome[20];
Mas as vezes você não sabe quanto precisará utilizar de memória, e é preciso alocar dinamicamente na execução do programa, para esse gerenciamento foram criadas as funções malloc(), calloc() e free(). Para o uso dessas funções é necessária a declaração da biblioteca <stdlib.h> que pode ser incluída facilmente em seu header assim:
#include<stdlib.h>
Malloc
A função malloc (Memory Allocation) aloca um espaço na memória do computador e devolve o endereço. Como argumento é passado o tamanho de memória que se deseja alocar, por exemplo, se quiser alocar um espaço para uma variável inteira é simples com o uso do operador sizeof que retorna o tamanho de bytes necessários para uma variável de x tipo. Então ficaria assim:
int *idade;
idade = (int*) malloc(sizeof(int));O endereço devolvido por malloc é do tipo *void, por isso foi necessário o cast(conversão).
Para atribuir valores a variáveis ponteiros digite o seguinte:
*idade = 13;Há possibilidade de que sua memória esteja toda ocupada e não permita a alocação com malloc(), caso isso ocorra malloc retornará NULL, então é sempre bom verificar:
if(idade == NULL){
printf("Memória cheia!");
}else{
printf("Alocado com sucesso!");
}
Free
Quando se aloca uma variável estáticamente ela desaparece sempre após a execução da função. Contudo quando alocamos espaço dinamicamente esses valores são mantidos na memória. Para isso a função free existe, para liberar espaço de memória alocado dinamicamente, o que esta função basicamente faz é liberar o espaço alocado com malloc para que outros processos possam utilizar este local. Free irá receber como parametro o ponteiro alocado com malloc, essa é a sintaxe:
free(idade);
Vetores e Matrizes
Para a criação de vetores dinamicamente, existe a função calloc que irá receber dois parametros o primeiro será o n, ou seja, o tamanho do vetor e por último o tamanho do byte que se deseja alocar assim como malloc, observe o exemplo abaixo:
int n;
int *p;
scanf("%d", &n);
p = (int*) calloc(n, sizeof(int));
Lembrando que a norma ANSI não permite digitar "int v[n]", a menos que n seja uma constante. O que está sendo feito acima é uma alocação de memória dinamicamente, a leitura desse vetor é feita da mesma forma que faria caso tivesse declarado um vetor estático:
Ou da seguinte forma, andando a cada endereço:int i;
for(i = 0; i < n; ++i){
scanf("%d", &p[i]);
}
int i;
for(i = 0; i < n; ++i){
scanf("%d", p+i);
}
A leitura também funciona da mesma forma:
int i;Lembrando que é possível a criação de vetores com malloc , da seguinte forma:
for(i = 0; i < n; ++i){
printf("%d", p[i]);//ou *p+i
}
p = (int*) malloc(n * sizeof(int));O que o código acima faz é, pedir que a memória aloque n espaços do tipo int, o que nada mais é do que um vetor.
A matriz segue na mesma linha da criação de vetores, a diferença é que será criado um vetor de vetores, com isso o seu ponteiro apontará para um ponteiro , segue exemplo abaixo:
int linhas,colunas,i;
int **matriz;
scanf("%d %d", &linhas,&colunas);
matriz = (int**) malloc( linhas * sizeof(int *));
for (i = 0; i < linhas; ++i)
matriz[i] = (int *) malloc (colunas * sizeof (int));
O processo é simples , quando colocado dois asteristicos "**", significa que o seu ponteiro será um ponteiro para um ponteiro, que é o que precisamos para criar a nossa matriz bidimensional, lemos o número de linhas e depois o número de colunas, em primeiro momento é alocado o espaço para as linhas que serão os nossos ponteiros para cada coluna, e por último varremos todas as linhas e alocamos x colunas.
Para leitura ou escrita basta fazer do mesmo jeito, com a sintaxe matriz[i][j].
Obrigado por lerem mais uma aula de C, fiquem a vontade para perguntar nos comentários e até a próxima!
0 comentários:
Postar um comentário