Malloc e Free
Essas funções permitem criar novos objetos não durante a compilação, mas durante a execução do programa, possibilitando o uso de alocação dinâmica de memória.
malloc()
Anteriormente, para alocar memória para nossos dados, bastava declarar:
int x;
Agora, com a função malloc(), é possível alocar memória dinamicamente:
int* pX = (int*)malloc(4);
A função malloc() exige como argumento o número de bytes a serem alocados. Caso não saiba o tamanho em bytes necessário, mas conheça o tipo de dado a ser armazenado, é possível ajustar a expressão assim:
int* pX = (int*)malloc(sizeof(int));
O que acontece a seguir?
Perceba que estamos atribuindo o resultado da função malloc() a um ponteiro. Isso significa que malloc() retorna um endereço!
O prefixo (int*) é uma conversão explícita. Especificamos manualmente o tipo desejado. Por exemplo:
double x = 3.14;
int y = (int)x; // `y` = 3
Main.c
1234567891011#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 da funçãomalloc().
Para armazenar dados no endereço fornecido pela função malloc(), utilizamos o operador de desreferência.
Main.c
123456789101112#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 semelhantes.
free()
Esta função é utilizada com ponteiros. Para ilustrar, vamos expandir o exemplo acima:
Main.c
1234567891011121314151617#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 após "deletarmos" um ponteiro, ele continua funcional, mas o valor armazenado em sua localização de memória associada torna-se 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 utilizado deve ser redefinido para NULL.
Main.c
1234567891011121314151617#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 como NULL após liberar sua memória é uma forma clara de indicar que o ponteiro não referencia mais um endereço de memória válido.
Sempre verifique se o ponteiro é NULL antes de utilizá-lo para garantir que você não está acessando memória inválida ou já alocada.
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo
Awesome!
Completion rate improved to 2.63
Malloc e Free
Deslize para mostrar o menu
Essas funções permitem criar novos objetos não durante a compilação, mas durante a execução do programa, possibilitando o uso de alocação dinâmica de memória.
malloc()
Anteriormente, para alocar memória para nossos dados, bastava declarar:
int x;
Agora, com a função malloc(), é possível alocar memória dinamicamente:
int* pX = (int*)malloc(4);
A função malloc() exige como argumento o número de bytes a serem alocados. Caso não saiba o tamanho em bytes necessário, mas conheça o tipo de dado a ser armazenado, é possível ajustar a expressão assim:
int* pX = (int*)malloc(sizeof(int));
O que acontece a seguir?
Perceba que estamos atribuindo o resultado da função malloc() a um ponteiro. Isso significa que malloc() retorna um endereço!
O prefixo (int*) é uma conversão explícita. Especificamos manualmente o tipo desejado. Por exemplo:
double x = 3.14;
int y = (int)x; // `y` = 3
Main.c
1234567891011#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 da funçãomalloc().
Para armazenar dados no endereço fornecido pela função malloc(), utilizamos o operador de desreferência.
Main.c
123456789101112#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 semelhantes.
free()
Esta função é utilizada com ponteiros. Para ilustrar, vamos expandir o exemplo acima:
Main.c
1234567891011121314151617#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 após "deletarmos" um ponteiro, ele continua funcional, mas o valor armazenado em sua localização de memória associada torna-se 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 utilizado deve ser redefinido para NULL.
Main.c
1234567891011121314151617#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 como NULL após liberar sua memória é uma forma clara de indicar que o ponteiro não referencia mais um endereço de memória válido.
Sempre verifique se o ponteiro é NULL antes de utilizá-lo para garantir que você não está acessando memória inválida ou já alocada.
Obrigado pelo seu feedback!