Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Malloc e free | Ponteiros
Noções Básicas de C
course content

Conteúdo do Curso

Noções Básicas de C

Noções Básicas de C

1. Introdução
2. Dados
3. Operadores
4. Instruções de controle
5. Funções
6. Ponteiros

bookMalloc 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 utilizar 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:

E agora? Repare 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. Nós especificamos manualmente o tipo desejado. Por exemplo:

c

Main

copy
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 para a função malloc().

Para armazenar dados no endereço fornecido pela função malloc(), utilizamos o operador de desreferência.

c

Main

copy
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 somente a memória alocada pela função malloc() e funções similares.

free()

Esta função é usada com ponteiros. Para ilustrar, vamos expandir o exemplo acima:

c

Main

copy
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 excluirmos um ponteiro, ele permanece funcional, mas o valor armazenado em seu local de memória associado torna-se corrompido.

Isso leva a um problema: uma célula de memória ocupada agora contém dados não confiáveis. Para prevenir isso, o ponteiro utilizado deve ser reiniciado para NULL.

c

Main

copy
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; }

Atribuir um ponteiro para NULL após liberar sua memória é uma maneira clara de indicar que o ponteiro não faz mais referência a um local de memória válido.

Sempre verifique se o ponteiro é NULL antes de usá-lo para garantir que você não esteja acessando memória inválida ou já alocada.

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 6. Capítulo 4
some-alt