Faça um programa que simule a memória de um computador: o usuário irá especificar o tamanho da memória, ou seja, quantos bytes serão alocados do tipo inteiro. Para tanto, a memória solicitada deve ser um valor múltiplo do tamanho do tipo inteiro. Em seguida, o usuário terá 2 opções: inserir um valor em uma determinada posição ou consultar o valor contido em uma determinada posição. A memória deve iniciar com todos os dados zerados.

Passo 1

O programa vai usar conceitos de alocação dinâmica de memória e manipulação de arrays para simular uma área de memória de inteiros.

Passo 2

Ler do usuário o tamanho em bytes da memória. Checar se esse valor é múltiplo de sizeof(int). Se não for, avisar o erro e pedir novamente.
Calcular o número de posições inteiras: qtd = bytes / sizeof(int). Alocar com calloc(qtd, sizeof(int)) para já iniciar tudo com zero.

Passo 3

Entrar num laço de menu com três opções: inserir valor, consultar valor ou sair.

Passo 4

Para inserir: pedir índice, validar se 0 ≤ índice < qtd; em caso positivo, pedir o valor inteiro e armazenar memoria[indice] = valor.
Para consultar: pedir índice, validar como acima; se for válido, exibir o valor em memoria[indice].

Passo 5

Ao sair do laço, liberar a área alocada com free e terminar o programa.

Resposta

#include <stdio.h>
#include <stdlib.h>
int main(void) {
size_t bytes;
int *memoria = NULL;
size_t qtd = 0;
// Passo 1: ler e validar tamanho em bytes
do {
    printf("Digite o tamanho da memória em bytes (múltiplo de %zu): ", sizeof(int));
    if (scanf("%zu", &bytes) != 1) {
        printf("Entrada inválida. Tente novamente.\n");
        // limpar stdin
        while (getchar() != '\n');
        continue;
    }
    if (bytes == 0 || bytes % sizeof(int) != 0) {
        printf("O número de bytes deve ser múltiplo de %zu e maior que zero.\n", sizeof(int));
    }
} while (bytes == 0 || bytes % sizeof(int) != 0);

// Passo 2: alocar e iniciar com zeros
qtd = bytes / sizeof(int);
memoria = (int*) calloc(qtd, sizeof(int));
if (!memoria) {
    printf("Falha na alocação de memória.\n");
    return 1;
}

// Passo 3: menu de operações
int opcao;
do {
    printf("\nMenu:\n");
    printf("1 - Inserir valor em uma posição\n");
    printf("2 - Consultar valor em uma posição\n");
    printf("0 - Sair\n");
    printf("Escolha uma opção: ");
    if (scanf("%d", &opcao) != 1) {
        printf("Opção inválida.\n");
        while (getchar() != '\n');
        continue;
    }

    if (opcao == 1) {
        size_t idx;
        int val;
        printf("Digite a posição (0 a %zu): ", qtd - 1);
        if (scanf("%zu", &idx) != 1) {
            printf("Entrada inválida.\n");
            while (getchar() != '\n');
            continue;
        }
        if (idx >= qtd) {
            printf("Posição fora do intervalo.\n");
        } else {
            printf("Digite o valor inteiro: ");
            scanf("%d", &val);
            memoria[idx] = val;
            printf("Valor inserido com sucesso.\n");
        }

    } else if (opcao == 2) {
        size_t idx;
        printf("Digite a posição (0 a %zu) para consulta: ", qtd - 1);
        if (scanf("%zu", &idx) != 1) {
            printf("Entrada inválida.\n");
            while (getchar() != '\n');
            continue;
        }
        if (idx >= qtd) {
            printf("Posição fora do intervalo.\n");
        } else {
            printf("Valor em memoria[%zu] = %d\n", idx, memoria[idx]);
        }

    } else if (opcao != 0) {
        printf("Opção não reconhecida.\n");
    }

} while (opcao != 0);

// Passo 4: liberar memória e encerrar
free(memoria);
printf("Programa encerrado.\n");
return 0;
}

Exercícios relacionados