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.