Menu
CoddyTech

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 correto

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

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 do usuário um inteiro n que representa o número de elementos a alocar
  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 em um ponteiro para double
  4. Ler do usuário n valores do tipo double 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 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

A 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 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;
}
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 Lógica e Fluxo

Pratique por conta própria: Compilador de C online