Usando sizeof() para Alocação
Parte da seção Lógica e Fluxo do Journey de C da Coddy. Lição 33 de 63.
Embora malloc() permita alocar memória dinamicamente, há 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 no seu sistema. Em vez de codificar os tamanhos em bytes diretamente, você pode deixar que sizeof() calcule automaticamente a quantidade correta:
// Em vez de adivinhar os tamanhos em bytes:
int *ptr = (int*)malloc(4); // Pressupõe que int tem 4 bytes
// Use sizeof() para garantir a portabilidade:
int *ptr = (int*)malloc(sizeof(int)); // Sempre corretoEssa abordagem se torna especialmente valiosa ao alocar arrays. Para alocar espaço para vários elementos, multiplique o número de elementos pelo tamanho de cada elemento:
// Aloque espaço para 10 inteiros
int *arr = (int*)malloc(10 * sizeof(int));
// Aloque espaço para 5 valores do tipo double
double *values = (double*)malloc(5 * sizeof(double));Usar sizeof() faz com que seu código funcione corretamente em diferentes sistemas, nos quais 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 determinado tipo.
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 do usuário um inteiro
nque representa o número de elementos a alocar - Usar
malloc()comsizeof()para alocar dinamicamente memória para um array denvalores do tipo double - Converter o ponteiro void retornado em um ponteiro para double
- Ler do usuário
nvalores do tipo double 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 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.1A 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.
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 o ponteiro retornado para double*
// 3. Leia n valores double e armazene-os no array alocado
// 4. Calcule e imprima a quantidade de 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 Lógica e Fluxo
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 ContatoPratique por conta própria: Compilador de C online