C - Gerenciamento de Memória

Este capítulo explica o gerenciamento de memória dinâmica em C. A linguagem de programação C fornece várias funções para alocação e gerenciamento de memória. Essas funções podem ser encontradas no<stdlib.h> arquivo de cabeçalho.

Sr. Não. Descrição da função
1

void *calloc(int num, int size);

Esta função aloca uma matriz de num elementos, cada um dos quais tamanho em bytes será size.

2

void free(void *address);

Esta função libera um bloco de bloco de memória especificado por endereço.

3

void *malloc(int num);

Esta função aloca uma matriz de num bytes e deixá-los não inicializados.

4

void *realloc(void *address, int newsize);

Esta função realoca a memória estendendo-a até newsize.

Alocando memória dinamicamente

Durante a programação, se você estiver ciente do tamanho de um array, é fácil e você pode defini-lo como um array. Por exemplo, para armazenar o nome de qualquer pessoa, ele pode ter no máximo 100 caracteres, então você pode definir algo da seguinte maneira -

char name[100];

Mas agora vamos considerar uma situação em que você não tem ideia sobre a extensão do texto que precisa armazenar, por exemplo, você deseja armazenar uma descrição detalhada sobre um tópico. Aqui precisamos definir um ponteiro para o caractere sem definir quanta memória é necessária e, posteriormente, com base no requisito, podemos alocar memória como mostrado no exemplo abaixo -

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {

   char name[100];
   char *description;

   strcpy(name, "Zara Ali");

   /* allocate memory dynamically */
   description = malloc( 200 * sizeof(char) );
	
   if( description == NULL ) {
      fprintf(stderr, "Error - unable to allocate required memory\n");
   } else {
      strcpy( description, "Zara ali a DPS student in class 10th");
   }
   
   printf("Name = %s\n", name );
   printf("Description: %s\n", description );
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado.

Name = Zara Ali
Description: Zara ali a DPS student in class 10th

O mesmo programa pode ser escrito usando calloc(); a única coisa que você precisa é substituir malloc por calloc da seguinte forma -

calloc(200, sizeof(char));

Portanto, você tem controle total e pode passar qualquer valor de tamanho enquanto aloca memória, ao contrário de matrizes em que uma vez definido o tamanho, você não pode alterá-lo.

Redimensionar e liberar memória

Quando seu programa é lançado, o sistema operacional libera automaticamente toda a memória alocada por seu programa, mas como uma boa prática quando você não precisar mais de memória, você deve liberar essa memória chamando a função free().

Como alternativa, você pode aumentar ou diminuir o tamanho de um bloco de memória alocado chamando a função realloc(). Vamos verificar o programa acima mais uma vez e usar as funções realloc () e free () -

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {

   char name[100];
   char *description;

   strcpy(name, "Zara Ali");

   /* allocate memory dynamically */
   description = malloc( 30 * sizeof(char) );
	
   if( description == NULL ) {
      fprintf(stderr, "Error - unable to allocate required memory\n");
   } else {
      strcpy( description, "Zara ali a DPS student.");
   }
	
   /* suppose you want to store bigger description */
   description = realloc( description, 100 * sizeof(char) );
	
   if( description == NULL ) {
      fprintf(stderr, "Error - unable to allocate required memory\n");
   } else {
      strcat( description, "She is in class 10th");
   }
   
   printf("Name = %s\n", name );
   printf("Description: %s\n", description );

   /* release memory using free() function */
   free(description);
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado.

Name = Zara Ali
Description: Zara ali a DPS student.She is in class 10th

Você pode tentar o exemplo acima sem realocar memória extra, e a função strcat () dará um erro devido à falta de memória disponível na descrição.