C Alocação de Memória Dinâmica
Alocação de memória dinâmica C
Neste tutorial, você aprenderá a alocar memória dinamicamente em seu programa C usando funções de biblioteca padrão:malloc(), calloc(), free() e realloc().
Como você sabe, um array é uma coleção de um número fixo de valores. Uma vez que o tamanho de um array é declarado, você não pode alterá-lo.
Às vezes, o tamanho do array que você declarou pode ser insuficiente. Para resolver esse problema, você pode alocar memória manualmente durante o tempo de execução. Isso é conhecido como alocação dinâmica de memória na programação C.
Para alocar memória dinamicamente, as funções da biblioteca são malloc()
, calloc()
, realloc()
e free()
são usados. Essas funções são definidas no <stdlib.h>
arquivo de cabeçalho.
C malloc()
O nome "malloc" significa alocação de memória.
O
malloc()
A função reserva um bloco de memória do número especificado de bytes. E retorna um ponteiro de void
que podem ser convertidos em ponteiros de qualquer forma. Sintaxe de malloc()
ptr = (castType*) malloc(size);
Exemplo
ptr = (float*) malloc(100 * sizeof(float));
A instrução acima aloca 400 bytes de memória. É porque o tamanho de
float
é 4 bytes. E o ponteiro ptr contém o endereço do primeiro byte na memória alocada. A expressão resulta em um
NULL
ponteiro se a memória não puder ser alocada. C calloc()
O nome "calloc" significa alocação contígua.
O
malloc()
função aloca memória e deixa a memória não inicializada, enquanto a função calloc()
função aloca memória e inicializa todos os bits para zero. Sintaxe de calloc()
ptr = (castType*)calloc(n, size);
Exemplo:
ptr = (float*) calloc(25, sizeof(float));
A instrução acima aloca espaço contíguo na memória para 25 elementos do tipo
float
. C livre()
Memória alocada dinamicamente criada com
calloc()
ou malloc()
não se liberta sozinho. Você deve usar explicitamente free()
para liberar o espaço. Sintaxe de free()
free(ptr);
Esta instrução libera o espaço alocado na memória apontada por
ptr
. Exemplo 1:malloc() e free()
// Program to calculate the sum of n numbers entered by the user
#include <stdio.h>
#include <stdlib.h>
int main() {
int n, i, *ptr, sum = 0;
printf("Enter number of elements: ");
scanf("%d", &n);
ptr = (int*) malloc(n * sizeof(int));
// if memory cannot be allocated
if(ptr == NULL) {
printf("Error! memory not allocated.");
exit(0);
}
printf("Enter elements: ");
for(i = 0; i < n; ++i) {
scanf("%d", ptr + i);
sum += *(ptr + i);
}
printf("Sum = %d", sum);
// deallocating the memory
free(ptr);
return 0;
}
Saída
Enter number of elements: 3
Enter elements: 100
20
36
Sum = 156
Aqui, alocamos dinamicamente a memória para n número de
int
. Exemplo 2:calloc() e free()
// Program to calculate the sum of n numbers entered by the user
#include <stdio.h>
#include <stdlib.h>
int main() {
int n, i, *ptr, sum = 0;
printf("Enter number of elements: ");
scanf("%d", &n);
ptr = (int*) calloc(n, sizeof(int));
if(ptr == NULL) {
printf("Error! memory not allocated.");
exit(0);
}
printf("Enter elements: ");
for(i = 0; i < n; ++i) {
scanf("%d", ptr + i);
sum += *(ptr + i);
}
printf("Sum = %d", sum);
free(ptr);
return 0;
}
Saída
Enter number of elements: 3
Enter elements: 100
20
36
Sum = 156
C realloc()
Se a memória alocada dinamicamente for insuficiente ou mais do que o necessário, você pode alterar o tamanho da memória alocada anteriormente usando o
realloc()
função. Sintaxe de realloc()
ptr = realloc(ptr, x);
Aqui, ptr é realocado com um novo tamanho x .
Exemplo 3:realloc()
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr, i , n1, n2;
printf("Enter size: ");
scanf("%d", &n1);
ptr = (int*) malloc(n1 * sizeof(int));
printf("Addresses of previously allocated memory:\n");
for(i = 0; i < n1; ++i)
printf("%pc\n",ptr + i);
printf("\nEnter the new size: ");
scanf("%d", &n2);
// rellocating the memory
ptr = realloc(ptr, n2 * sizeof(int));
printf("Addresses of newly allocated memory:\n");
for(i = 0; i < n2; ++i)
printf("%pc\n", ptr + i);
free(ptr);
return 0;
}
Saída
Enter size: 2 Addresses of previously allocated memory: 26855472 26855476 Enter the new size: 4 Addresses of newly allocated memory: 26855472 26855476 26855480 26855484
Linguagem C
- Memória somente leitura (ROM)
- Microprocessadores
- Gerenciamento de memória C++:novo e excluir
- O Cervoz atualiza a memória DDR4-2666 de próxima geração
- Alocação dinâmica de matrizes em C++ com exemplo
- Função calloc() na biblioteca C com o programa EXEMPLO
- Função realloc() na Biblioteca C:Como usar? Sintaxe e Exemplo
- C - Gerenciamento de Memória
- O preço dinâmico no varejo tradicional é inevitável
- Memória Dinâmica C++