C Alocação de memória dinâmica usando malloc (), calloc (), free () e realloc ()

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 voidque 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 NULLponteiro 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

Artigos interessantes...