Menu
Coddy logo textTech

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 correto

Essa 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.

challenge icon

Desafio

Fácil

Escreva um programa em C que demonstre o uso adequado de sizeof() com malloc() para alocação dinâmica de memória. Seu programa deve:

  1. Ler um número inteiro n do usuário, representando o número de elementos a serem alocados
  2. Usar malloc() com sizeof() para alocar dinamicamente memória para um array de n valores do tipo double
  3. Converter o ponteiro void retornado para um ponteiro double
  4. Ler n valores double do usuário e armazená-los no array alocado
  5. Calcular a memória total alocada em bytes e imprimi-la no formato: Memory allocated: [bytes] bytes
  6. Calcular e imprimir a média de todos os valores com exatamente 2 casas decimais no formato: Average: [value]
  7. 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.1

Sua saída deve ser:

Memory allocated: 24 bytes
Average: 4.80
Largest: 7.80

Este 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;
}
quiz iconTeste seus conhecimentos

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