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, uma matriz é uma coleção de um número fixo de valores. Depois que o tamanho de uma matriz é declarado, você não pode alterá-lo.
Às vezes, o tamanho da matriz 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 dinamicamente a memória, funções de biblioteca são malloc()
, calloc()
, realloc()
e free()
são usados. Essas funções são definidas no arquivo de cabeçalho.
C malloc ()
O nome "malloc" significa alocação de memória.
A malloc()
função reserva um bloco de memória com o número especificado de bytes. E ele retorna um ponteiro void
que pode ser convertido em ponteiros de qualquer formato.
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.
A malloc()
função aloca memória e deixa a memória não inicializada. Enquanto a 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 ()
A memória alocada dinamicamente criada com um calloc()
ou malloc()
não é liberada por conta própria. 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 #include 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; )
Aqui, alocamos dinamicamente a memória para n números de int
.
Exemplo 2: calloc () e free ()
// Program to calculate the sum of n numbers entered by the user #include #include 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; )
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 a realloc()
função.
Sintaxe de realloc ()
ptr = realloc(ptr, x);
Aqui, ptr é realocado com um novo tamanho x.
Exemplo 3: realloc ()
#include #include 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: "); for(i = 0; i < n1; ++i) printf("%u",ptr + i); printf("Enter the new size: "); scanf("%d", &n2); // rellocating the memory ptr = realloc(ptr, n2 * sizeof(int)); printf("Addresses of newly allocated memory: "); for(i = 0; i < n2; ++i) printf("%u", ptr + i); free(ptr); return 0; )
Quando você executa o programa, a saída será:
Insira o tamanho: 2 Endereços da memória alocada anteriormente: 26855472 26855476 Insira o novo tamanho: 4 Endereços da memória recentemente alocada: 26855472 26855476 26855480 26855484