Quiz (Structs)

Teste seu entendimento sobre inicialização de struct, atribuição, operador seta e vetores de structs.

Questão 1 — Fundamentos de struct

struct Point { int x; int y; };
struct Point p = {3, 7};
printf("(%d, %d)\n", p.x, p.y);

O que isso imprime?

(3, 7)
(7, 3)
Erro de compilação
(0, 0)
Explicação: Os membros de uma struct são inicializados na ordem de declaração: p.x=3, p.y=7.

Questão 2 — Atribuição de struct

struct Point a = {1, 2};
struct Point b;
b = a;
b.x = 10;
printf("a.x=%d, b.x=%d\n", a.x, b.x);

O que isso imprime?

a.x=10, b.x=10
a.x=1, b.x=10
Erro de compilação
a.x=1, b.x=1
Explicação: Atribuição de struct é uma cópia por valor. b se torna uma cópia independente de a, então mudar b.x não afeta a.x.

Questão 3 — Operador seta

struct Point p = {5, 8};
struct Point *ptr = &p;
printf("%d\n", ptr->y);

O que isso imprime?

5
8
Erro de compilação
Um endereço
Explicação: ptr->y é uma forma curta de (*ptr).y. Use o operador seta para acessar membros através de um ponteiro. p.y = 8.

Questão 4 — Vetor de structs

struct Student { char name[20]; int score; };
struct Student s[3] = {
    {"Taro", 80}, {"Hanako", 95}, {"Jiro", 70}
};
int max = 0;
for (int i = 0; i < 3; i++) {
    if (s[i].score > s[max].score) max = i;
}
printf("%s\n", s[max].name);

O que isso imprime?

Taro
Hanako
Jiro
Erro de compilação
Explicação: O laço encontra o estudante com a maior pontuação. s[1].score=95 é a maior, então max=1 e s[1].name = "Hanako".

Questão 5 — Definindo com typedef

typedef struct {
    int x;
    int y;
} Point;

Point p = {3, 4};
printf("%d\n", p.x + p.y);

O que isso imprime?

Erro de compilação
7
12
34
Explicação: typedef struct { ... } Point; dá à struct o apelido Point.
  • A partir daí, você pode escrever Point p; sem a palavra-chave struct
  • p.x = 3, p.y = 4
  • 3 + 4 = 7
typedef deixa o código mais legível e é comum em projetos maiores.

Questão 6 — Structs aninhadas

struct Point { int x; int y; };
struct Line {
    struct Point start;
    struct Point end;
};
struct Line l = {{0, 0}, {3, 4}};
printf("%d\n", l.end.x);

O que isso imprime?

0
3
4
Erro de compilação
Explicação: Membros de structs aninhadas são alcançados por pontos encadeados.
  • l.end é {3, 4} (uma struct Point)
  • l.end.x = 3, l.end.y = 4
Aninhar structs é a forma padrão de modelar tipos mais complexos.

Questão 7 — Tamanho de struct e padding

// Ambiente 64-bit típico (int=4, char=1, alinhamento=4)
struct S {
    char c;
    int i;
};
printf("%lu\n", sizeof(struct S));

Qual é a saída mais provável?

5 (1 + 4)
8 (padding inserido)
4
2
Explicação: O tamanho de uma struct não é simplesmente a soma dos membros — padding é inserido para satisfazer requisitos de alinhamento.
  • char c (1 byte) + 3 bytes de padding + int i (4 bytes) = 8 bytes
  • int tipicamente precisa ficar numa fronteira de 4 bytes, então padding é inserido depois de c
Ordenar os membros do tipo maior para o menor reduz padding e melhora a eficiência de memória.

Questão 8 — Passando uma struct por valor

struct Point { int x; int y; };

void reset(struct Point p) {
    p.x = 0;
    p.y = 0;
}
int main(void) {
    struct Point pt = {5, 10};
    reset(pt);
    printf("%d %d\n", pt.x, pt.y);
    return 0;
}

O que isso imprime?

0 0
5 10
0 10
Erro de compilação
Explicação: Structs também são passadas para funções por valor (como cópia).
  • Dentro de reset, p é uma cópia de pt
  • Mudar a cópia não tem efeito no pt do chamador
  • Então pt permanece 5 10
Para modificar a struct do chamador, passe por ponteiro (void reset(struct Point *p)) e use p->x = 0;. Passar por ponteiro também é uma boa forma de evitar custo de cópia em structs grandes.

Questão 9 — Inicialização de struct

struct Point { int x; int y; int z; };
struct Point p = {5};
printf("%d %d %d\n", p.x, p.y, p.z);

O que isso imprime?

5 5 5
5 0 0
5 (indeterminado) (indeterminado)
Erro de compilação
Explicação: Quando um inicializador de struct cobre apenas alguns membros, os membros restantes são preenchidos com zero (assim como em vetores).
  • p.x = 5 (explícito)
  • p.y e p.z são omitidos, então ambos caem para 0
Escrever struct Point p = {0}; inicializa todos os membros com zero. Com os designated initializers do C99, você também pode inicializar apenas membros específicos: {.x = 5}.

Resultado

Responda todas as questões para ver sua pontuação.
Início