Usando sizeof() para Alocação
Parte da seção Logic & Flow do Journey de C da Coddy — lição 33 de 63.
Embora o malloc() permita que você aloque memória dinamicamente, existe uma prática recomendada importante que torna seu código mais portátil e fácil de manter: usar o operador sizeof() para determinar quantos bytes alocar.
O operador sizeof() retorna o número de bytes necessários para armazenar um tipo de dado específico em seu sistema. Em vez de codificar rigidamente os tamanhos em bytes, você pode deixar o sizeof() calcular a quantidade correta automaticamente:
// Em vez de adivinhar os tamanhos em bytes:
int *ptr = (int*)malloc(4); // Assume que int tem 4 bytes
// Use sizeof() para portabilidade:
int *ptr = (int*)malloc(sizeof(int)); // Sempre corretoEssa abordagem torna-se especialmente valiosa ao alocar arrays. Para alocar espaço para múltiplos elementos, multiplique o número de elementos pelo tamanho de cada elemento:
// Aloca espaço para 10 inteiros
int *arr = (int*)malloc(10 * sizeof(int));
// Aloca espaço para 5 doubles
double *values = (double*)malloc(5 * sizeof(double));O uso de sizeof() faz com que seu código funcione corretamente em diferentes sistemas onde os tipos de dados podem ter tamanhos diferentes, e comunica claramente sua intenção de alocar espaço para um número específico de elementos de um tipo específico.
Desafio
FácilEscreva um programa em C que demonstre o uso adequado de sizeof() com malloc() para alocação dinâmica de memória. Seu programa deve:
- Ler um número inteiro
ndo usuário, representando o número de elementos a serem alocados - Usar
malloc()comsizeof()para alocar dinamicamente memória para um array denvalores do tipo double - Converter o ponteiro void retornado para um ponteiro double
- Ler
nvalores double do usuário e armazená-los no array alocado - Calcular a memória total alocada em bytes e imprimi-la no formato:
Memory allocated: [bytes] bytes - Calcular e imprimir a média de todos os valores com exatamente 2 casas decimais no formato:
Average: [value] - Encontrar e imprimir o maior valor com exatamente 2 casas decimais no formato:
Largest: [value]
Lembre-se de incluir o cabeçalho <stdlib.h> para usar malloc(). Seu programa deve demonstrar como o sizeof() garante a alocação correta de memória, independentemente dos tamanhos dos tipos de dados do sistema.
Por exemplo, se a entrada for:
3
2.5 7.8 4.1Sua saída deve ser:
Memory allocated: 24 bytes
Average: 4.80
Largest: 7.80Este desafio reforça a importância de usar sizeof() para tornar sua alocação dinâmica de memória portátil e sustentável, calculando automaticamente o número correto de bytes necessários para qualquer tipo de dado em qualquer sistema.
Experimente você mesmo
#include <stdio.h>
#include <stdlib.h>
int main() {
// Leia o número de elementos
int n;
scanf("%d", &n);
// TODO: Escreva seu código abaixo
// 1. Aloque memória para n valores double usando malloc() e sizeof()
// 2. Converta (cast) o ponteiro retornado para double*
// 3. Leia n valores double e armazene-os no array alocado
// 4. Calcule e imprima a memória alocada em bytes
// 5. Calcule e imprima a média com 2 casas decimais
// 6. Encontre e imprima o maior valor com 2 casas decimais
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