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 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 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:

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

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 do tipo 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 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;
}
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