Conteúdo do Curso
Fundamentos de C
Fundamentos de C
Malloc e Free
Essas funções nos permitem criar novos objetos não durante a compilação, mas durante a execução do programa, permitindo-nos usar alocação dinâmica de memória.
malloc()
Antes, para alocar memória para nossos dados, simplesmente declararíamos:
Agora, com a função malloc()
, podemos alocar memória dinamicamente:
A função malloc()
requer o número de bytes a serem alocados como seu argumento. Se você não tem certeza do tamanho em bytes necessário, mas sabe o tipo de dado a ser armazenado, pode ajustar a expressão assim:
O que vem a seguir?
Observe que estamos atribuindo o resultado da função malloc()
a um ponteiro. Isso significa que malloc()
retorna um endereço!
O prefixo (int*)
é um cast explícito. Especificamos manualmente o tipo desejado. Por exemplo:
Main
#include <stdio.h> #include <stdlib.h> // new header file! int main() { int* pX = (int*)malloc(sizeof(int)); printf("Address of allocated memory: %p\n", pX); return 0; }
Nota
Lembre-se de incluir o arquivo de cabeçalho
stdlib.h
. Ele contém o protótipo para a funçãomalloc()
.
Para armazenar dados no endereço fornecido pela função malloc()
, usamos o operador de desreferência.
Main
#include <stdio.h> #include <stdlib.h> int main() { int* pX = (int*)malloc(sizeof(int)); *pX = 100; printf(" Value %d at address %p\n", *pX, pX); return 0; }
É possível liberar memória? – Sim, mas apenas a memória alocada por malloc()
e funções similares.
free()
Esta função é usada com ponteiros. Para ilustrar, vamos expandir o exemplo acima:
Main
#include <stdio.h> #include <stdlib.h> int main() { int* pX = (int*)malloc(sizeof(int)); *pX = 100; printf(" Value %d at address %p\n", *pX, pX); free(pX); printf("After `free()` value %d at address %p\n", *pX, pX); return 0; }
Curiosamente, mesmo depois de "deletarmos" um ponteiro, ele permanece funcional, mas o valor armazenado em sua localização de memória associada se torna corrompido.
Isso leva a um problema: uma célula de memória ocupada agora contém dados não confiáveis. Para evitar esses ponteiros, o ponteiro usado deve ser redefinido para NULL
.
Main
#include <stdio.h> #include <stdlib.h> int main() { int* pX = (int*)malloc(sizeof(int)); *pX = 100; printf("Value %d at address %p\n", *pX, pX); free(pX); pX = NULL; return 0; }
Definir um ponteiro para NULL
após liberar sua memória é uma maneira clara de indicar que o ponteiro não referencia mais uma localização de memória válida.
Sempre verifique se o ponteiro é NULL
antes de usá-lo para garantir que você não está acessando memória inválida ou já alocada.
Obrigado pelo seu feedback!