🧩 Exercícios: Structs, Struct Padding, Unions e Enumerações
Spec Sistemas Com C • Trilha Progressiva em 4 Níveis
🎯 Nível 1: Fundamentos
Problema 16.1 — Declaração de struct com typedef e Operador Seta (->)
Contexto: Declaração de struct com typedef e Operador Seta (->) no contexto de Structs, Struct Padding, Unions e Enumerações.
Requisitos de Execução:
- Criar struct
Produtocontendo id, nome e preco e acessar campos via ponteiro com->.
Resultado Esperado
Struct instanciada e manipulada através de ponteiro com operador seta.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_16_1_SeuNome - Envie na tarefa:
Atividade Cap 16 - Structs, Struct Padding, Unions e Enumerações
🔑 Gabarito de Código & Solução Comentada
#include <stdio.h>
typedef struct {
int id;
char nome[30];
double preco;
} Produto;
void exibir_produto(const Produto *p) {
printf("ID: %d | Nome: %s | Preco: R$ %.2f\n", p->id, p->nome, p->preco);
}
int main(void) {
Produto prod = {101, "Teclado", 250.00};
exibir_produto(&prod);
return 0;
}
🔍 Nível 2: Prática
Problema 16.2 — Struct Padding, Alinhamento de Memória e Atributo packed
Contexto: Struct Padding, Alinhamento de Memória e Atributo packed no contexto de Structs, Struct Padding, Unions e Enumerações.
Requisitos de Execução:
- Demonstrar o impacto do alinhamento de bytes na memória medindo
sizeof(struct)antes e depois da reordenação dos campos.
Resultado Esperado
Tamanho da struct otimizado reduzindo bytes de padding inativos.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_16_2_SeuNome - Envie na tarefa:
Atividade Cap 16 - Structs, Struct Padding, Unions e Enumerações
🔑 Gabarito de Código & Solução Comentada
#include <stdio.h>
typedef struct {
char c1; // 1 byte (+ 7 padding)
double d; // 8 bytes
char c2; // 1 byte (+ 7 padding)
} NaoOtimizada;
typedef struct {
double d; // 8 bytes
char c1; // 1 byte
char c2; // 1 byte (+ 6 padding)
} Otimizada;
int main(void) {
printf("Nao otimizada: %zu bytes\n", sizeof(NaoOtimizada));
printf("Otimizada: %zu bytes\n", sizeof(Otimizada));
return 0;
}
⚡ Nível 3: Integração
Problema 16.3 — Unions e Estruturas com Tag (Tagged Unions)
Contexto: Unions e Estruturas com Tag (Tagged Unions) no contexto de Structs, Struct Padding, Unions e Enumerações.
Requisitos de Execução:
- Modelar união que compartilhe o mesmo espaço de memória para representar inteiro, float ou string.
Resultado Esperado
Tagged union manipulando diferentes tipos com consumo mínimo de memória.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_16_3_SeuNome - Envie na tarefa:
Atividade Cap 16 - Structs, Struct Padding, Unions e Enumerações
🔑 Gabarito de Código & Solução Comentada
#include <stdio.h>
typedef enum { TIPO_INT, TIPO_FLOAT } TipoDado;
typedef struct {
TipoDado tipo;
union {
int valor_int;
float valor_float;
} dado;
} ValorFlexivel;
int main(void) {
ValorFlexivel v;
v.tipo = TIPO_INT;
v.dado.valor_int = 42;
printf("Union Inteiro: %d\n", v.dado.valor_int);
return 0;
}
🏆 Nível 4: Desafio Corporativo
Problema 16.4 — Campos de Bits (Bit-fields) para Compactação de Flags
Contexto: Campos de Bits (Bit-fields) para Compactação de Flags no contexto de Structs, Struct Padding, Unions e Enumerações.
Requisitos de Execução:
- Compactar 8 flags booleanas de permissão em um único byte utilizando bit-fields
unsigned int flag : 1.
Resultado Esperado
8 flags armazenadas em apenas 1 byte de memória.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_16_4_SeuNome - Envie na tarefa:
Atividade Cap 16 - Structs, Struct Padding, Unions e Enumerações
🔑 Gabarito de Código & Solução Comentada
#include <stdio.h>
typedef struct {
unsigned int read : 1;
unsigned int write : 1;
unsigned int exec : 1;
unsigned int admin : 1;
unsigned int : 4; // Padding
} Permissoes;
int main(void) {
Permissoes p = {1, 1, 0, 1};
printf("Tamanho das permissoes: %zu byte | Admin=%u\n", sizeof(Permissoes), p.admin);
return 0;
}