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 de 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:
// Alocar espaço para 10 inteiros
int *arr = (int*)malloc(10 * sizeof(int));
// Alocar 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 do tipo 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 fácil de manter, calculando automaticamente o número correto de bytes necessários para qualquer tipo de dado em qualquer sistema.
Folha de consulta
Use o operador sizeof() com malloc() para determinar o número correto de bytes a serem alocados para qualquer tipo de dado:
// Alocação de memória portátil
int *ptr = (int*)malloc(sizeof(int));
// Alocando arrays
int *arr = (int*)malloc(10 * sizeof(int));
double *values = (double*)malloc(5 * sizeof(double));O operador sizeof() retorna o número de bytes necessários para armazenar um tipo de dado em seu sistema, tornando seu código portátil entre diferentes plataformas onde os tipos de dados podem ter tamanhos diferentes.
Experimente você mesmo
#include <stdio.h>
#include <stdlib.h>
int main() {
// Ler o número de elementos
int n;
scanf("%d", &n);
// TODO: Escreva seu código abaixo
// 1. Alocar memória para n valores double usando malloc() e sizeof()
// 2. Converter o ponteiro retornado para double*
// 3. Ler n valores double e armazená-los no array alocado
// 4. Calcular e imprimir a memória alocada em bytes
// 5. Calcular e imprimir a média com 2 casas decimais
// 6. Encontrar e imprimir 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