English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Neste tutorial, você aprenderá a usar as funções da biblioteca padrão: malloc(), calloc(), free() e realloc() para alocar memória dinamicamente em programas C.
Como você já sabe, um array é um conjunto fixo de valores. Após declarar o tamanho do array, você não pode mudá-lo.
Às vezes, o tamanho do array que você declarou pode ser insuficiente. Para resolver esse problema, você pode alocar memória manualmente durante a execução. Isso é chamado de alocação de memória dinâmica em programação C.
Pode-se usar as funções da biblioteca padrão malloc(), calloc(), realloc() e free() para alocar memória dinamicamente. Essas funções são definidas no cabeçalho <stdlib.h>.
O nome “malloc” significa alocação de memória.
A função malloc() reserva um bloco de memória de bytes especificados. E ela retorna um voidPonteiropode ser convertida em qualquer tipo de ponteiro.
ptr = (castType*) malloc(size);
Exemplo
ptr = (float*) malloc(100 * sizeof(float));
A sentença acima alocou400 bytes de memória. Porque o tamanho do número flutuante é4Bytes. E o ponteiro ptr armazena o endereço do primeiro byte da memória alocada.
Se não for possível alocar memória, a expressão produzirá um ponteiro NULL.
O nome “calloc” significa alocação contínua.
A função malloc() aloca memória e mantém memória não inicializada. Enquanto a função calloc() aloca memória e inicializa todos os bits com zero.
ptr = (castType*)calloc(n, size);
Exemplo:
ptr = (float*)calloc(25, sizeof(float));
A instrução acima aloca espaço na memória para25elementos do tipo float em espaço contíguo.
A memória alocada dinamicamente com calloc() ou malloc() não é liberada automaticamente. É necessário usar explicitamente free() para liberar o espaço.
free(ptr);
A instrução libera o espaço alocado no memória apontada por ptr.
//Programa para calcular a soma dos n números introduzidos pelo usuário #include <stdio.h> #include <stdlib.h> int main() { int n, i, *ptr, sum = 0; printf("Número de elementos a introduzir: "); scanf("%d", &n); ptr = (int*)malloc(n * sizeof(int)); // Se não for possível alocar memória if(ptr == NULL) { printf("Erro! Memória não alocada."); exit(0); } printf("Introduzir elemento: "); for(i = 0; i < n; ++i) { scanf("%d", ptr + i); sum += *(ptr + i); } printf("Soma = %d", sum); //Liberar memória free(ptr); return 0; }
Aqui, alocamos memória dinamicamente para n int.
//Programa para calcular a soma dos n números introduzidos pelo usuário #include <stdio.h> #include <stdlib.h> int main() { int n, i, *ptr, sum = 0; printf("Número de elementos a introduzir: "); scanf("%d", &n); ptr = (int*)calloc(n, sizeof(int)); if(ptr == NULL) { printf("Erro! Memória não alocada."); exit(0); } printf("Introduzir elemento: "); for(i = 0; i < n; ++i) { scanf("%d", ptr + i); sum += *(ptr + i); } printf("Soma = %d", sum); free(ptr); return 0; }
Se a memória alocada dinamicamente não for suficiente ou exceder a necessidade, pode-se usar a função realloc() para alterar o tamanho da memória alocada anteriormente.
ptr = realloc(ptr, x);
Aqui, ptr é alocado para o novo tamanho x.
#include <stdio.h> #include <stdlib.h> int main() { int *ptr, i, n1, n2; printf("Tamanho a ser introduzido: "); scanf("%d", &n1); ptr = (int*)malloc(n1 * sizeof(int)); printf("Endereço de memória alocado anteriormente: "); for (i = 0; i < n1; ++i) printf("睵n", ptr + i); printf("\nTamanho novo a ser alocado: "); scanf("%d", &n2); //Alocar memória novamente ptr = realloc(ptr, n2 * sizeof(int)); printf("Nova endereço de memória alocada: "); for (i = 0; i < n2; ++i) printf("睵n", ptr + i); free(ptr); return 0; }
A saída do programa ao executar é:
Insira o tamanho: 3 Endereço de memória alocado anteriormente: 7452312 7452316 7452320 Insira o novo tamanho: 5 Endereço de memória recém-alocado: 7452312 7452316 7452320 7452324 7452328