Dando continuidade ao nosso Curso de Programação com a Linguagem C, nesta aula vamos iniciar o estudo sobre alocação dinâmica de memória com a função MALLOC.
Em muitas situações será necessário alocar memória de forma dinâmica, ou seja, em tempo de execução. Uma das formas de fazer isso na linguagem de programação C é com a função malloc.
Sua utilização é bem simples. A alocação de memória é feita em blocos de bytes, assim, precisamos apenas passar como parâmetro quantos bytes de memória precisamos. Não se preocupe se você não sabe quantos bytes você precisa, podemos descobrir isso com o operador sizeof que já aprendemos como usar lá no início do curso.
A função malloc retorna o endereço inicial do bloco de memória alocado ou NULL caso não consiga alocar a quantidade de memória solicitada.
No trecho de código a seguir é criado um ponteiro para inteiro chamado x. Em seguida é feito a alocação de memória para um int e seu endereço é retornado e salvo no ponteiro x.
int *x; x = malloc(sizeof(int));
Agora que alocamos memória para um inteiro e salvamos seu endereço na variável x, podemos alterar e acessar seu conteúdo, como feito a seguir:
*x = 50; // a região de memória apontada por x recebe o valor 50 printf("x: %d\n", *x); // imprime o conteúdo apontado por x
Um detalhe importante a ser observado é que nem sempre será possível alocar a memória solicitada, por isso é uma boa prática de programação sempre verificar se a alocação de memória foi bem sucedida, assim:
int *x; x = malloc(sizeof(int)); if(x){ // x é diferente de NULL? // alocação bem sucedida } else{ printf("Erro ao alocar memoria!\n"); }
Código de exemplo completo em C com a função malloc
/* Aula 197: Alocação dinâmica de memória com a função malloc. Retorna um ponteiro para a região de memória alocada ou NULL. Código escrito por Wagner Gaspar Maior de 2021 */ int main(){ int *x; x = malloc(sizeof(int)); if(x){ printf("Memoria alocada com sucesso!\n"); printf("x: %d\n", *x); *x = 50; printf("x: %d\n", *x); } else{ printf("Erro ao alocar memoria!\n"); } return 0; }