Alocação Dinâmica - malloc()
Parte da seção Logic & Flow do Journey de C da Coddy — lição 32 de 63.
Agora você aprenderá sobre malloc(), a principal função para solicitar memória do heap durante a execução do programa. A função malloc() significa "memory allocation" e permite que você aloque memória dinamicamente quando precisar, em vez de declarar variáveis de tamanho fixo em tempo de compilação.
A função malloc() recebe um argumento: o número de bytes que você deseja alocar. Ela retorna um ponteiro void para o bloco de memória alocado, ou NULL se a alocação falhar. Como ela retorna um ponteiro void, você deve realizar o cast para o tipo de dado apropriado.
#include <stdlib.h>
int *ptr = (int*)malloc(sizeof(int)); // Aloca memória para um inteiro
// ptr agora aponta para um local de memória que pode conter um inteiroA principal vantagem do
malloc()é a flexibilidade - você pode solicitar exatamente a quantidade de memória necessária em tempo de execução, e essa memória permanece disponível até que você a libere explicitamente. Isso é particularmente útil quando você não sabe de quanta memória precisará até que seu programa esteja em execução.
Lembre-se de incluir <stdlib.h> para usar malloc(), e sempre realize o cast do ponteiro void retornado para corresponder ao tipo de dado com o qual você está trabalhando.
Desafio
FácilEscreva um programa em C que demonstre a alocação dinâmica de memória usando malloc() para criar e trabalhar com um único inteiro na heap. Seu programa deve:
- Usar
malloc()para alocar memória dinamicamente para um inteiro - Converter (cast) o ponteiro void retornado para um ponteiro de inteiro
- Ler um valor inteiro da entrada do usuário
- Armazenar o valor de entrada na memória alocada dinamicamente usando o operador de desreferência
- Imprimir o valor armazenado no formato:
Stored value: [value] - Calcular e armazenar o quadrado do valor no mesmo local de memória
- Imprimir o valor ao quadrado no formato:
Squared value: [value]
Lembre-se de incluir o cabeçalho <stdlib.h> para usar malloc(). Seu programa deve demonstrar o fluxo de trabalho básico da alocação dinâmica de memória: solicitar memória da heap, usá-la para armazenar e manipular dados, e trabalhar com a memória alocada por meio de operações de ponteiro.
Por exemplo, se o usuário inserir 7, sua saída deve ser:
Stored value: 7
Squared value: 49Este desafio apresenta o conceito fundamental de alocação dinâmica de memória, onde a memória é solicitada em tempo de execução em vez de ser fixa em tempo de compilação, dando aos seus programas maior flexibilidade no uso da memória.
Folha de consulta
A função malloc() aloca memória dinamicamente do heap durante a execução do programa. Ela recebe o número de bytes a serem alocados e retorna um ponteiro void para o bloco de memória alocado, ou NULL se a alocação falhar.
Inclua <stdlib.h> para usar malloc():
#include <stdlib.h>
int *ptr = (int*)malloc(sizeof(int)); // Aloca memória para um inteiroPontos-chave:
- Sempre faça o cast do ponteiro void retornado para o tipo de dado apropriado
- A memória permanece disponível até ser explicitamente liberada
- Oferece flexibilidade para solicitar quantidades exatas de memória em tempo de execução
- Use
sizeof()para determinar o número correto de bytes necessários
Experimente você mesmo
#include <stdio.h>
#include <stdlib.h>
int main() {
// Ler entrada
int input_value;
scanf("%d", &input_value);
// TODO: Escreva seu código abaixo
// 1. Use malloc() para alocar memória para um inteiro
// 2. Converta o ponteiro retornado para int*
// 3. Armazene o valor de entrada na memória alocada
// 4. Imprima o valor armazenado
// 5. Calcule e armazene o quadrado no mesmo local
// 6. Imprima o valor ao quadrado
return 0;
}Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Logic & Flow
1Fundamentos de Ponteiros
O que é um Ponteiro?Declarando PonteirosO Operador de Endereço (&)O Operador de Desreferência (*)Ponteiros NULLRecapitulação: Fundamentos de Ponteiros4Projeto: Utilitário de Texto Simples
Visão Geral do ProjetoContando Caracteres2Ponteiros e Arrays
Nomes de Arrays como PonteirosElementos de Array - PonteirosAritmética de PonteirosComparando PonteirosRecapitulação: Percorrendo Arrays com Ponteiros5Ponteiros e Funções
Passagem por ValorPassando Ponteiros para FunçõesModificando Variáveis via PonteirosUm Exemplo Clássico: SwapPassando Arrays para FunçõesRecapitulação: Ponteiros como Argumentos3Arrays de Caracteres e Strings
Strings como Arrays de charO Terminador NuloEntrada de Strings com scanfUsando strlen()Usando strcpy()Usando strcat()Usando strcmp()Recapitulação: Funções Básicas de Strings6Gerenciamento de Memória
Memória Stack vs. HeapAlocação Dinâmica - malloc()Usando sizeof() para AlocaçãoVerificando Falhas de AlocaçãoLiberando Memória com free()Alocando com calloc()Recapitulação: Array Dinâmico9Projeto: Cadastro Simples de Contatos
Projeto: Definir a Struct de ContatoFunção para Criar um Contato