0Pricing
C Academy · Aula

Um tipo de vetor reutilizável

Envolva tamanho e capacidade.

Um tipo de vetor reutilizável é uma aula grátis de C Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C Academy inclui 4 aulas no total.

De código disperso a um tipo

Passar um ponteiro, uma quantidade e uma capacidade como três variáveis separadas é propenso a erros.

Vamos agrupá-los em uma única struct: um array dinâmico reutilizável, geralmente chamado de vetor. Ele reúne os dados e as informações de controle.

A struct do vetor

Um vetor precisa de três campos: um ponteiro para os dados, quantos elementos estão sendo usados (len) e quantos cabem antes do redimensionamento (cap).

typedef struct {
    int    *data;
    size_t  len;
    size_t  cap;
} Vec;

Inicializando um vetor

Um vetor vazio tem um ponteiro de dados NULL e comprimento e capacidade iguais a zero. Uma pequena função de inicialização torna a intenção clara.

void vec_init(Vec *v) {
    v->data = NULL;
    v->len = 0;
    v->cap = 0;
}

A operação de inserção

vec_push adiciona um elemento ao final. Se o vetor estiver cheio, ele primeiro dobra a capacidade.

Ele retorna 0 em caso de sucesso e -1 se a alocação falhar, para que os chamadores possam reagir.

int vec_push(Vec *v, int value) {
    if (v->len == v->cap) {
        size_t nc = v->cap ? v->cap * 2 : 4;
        int *tmp = realloc(v->data, nc * sizeof(*v->data));
        if (!tmp) return -1;
        v->data = tmp;
        v->cap = nc;
    }
    v->data[v->len++] = value;
    return 0;
}

Lendo os elementos

Como len registra a quantidade usada, o senhor deve iterar de 0 até len - 1. A capacidade pode ser maior, mas esses espaços ainda não fazem parte dos seus dados.

for (size_t i = 0; i < v->len; i++)
    printf("%d\n", v->data[i]);

Liberando o vetor

Um vetor é proprietário do seu buffer na heap, portanto precisa de uma função de limpeza correspondente. Depois de liberá-lo, redefina os campos para que a struct não possa ser usada incorretamente.

void vec_free(Vec *v) {
    free(v->data);
    v->data = NULL;
    v->len = v->cap = 0;
}

Reunindo tudo

Este programa completo cria um vetor, insere cinco valores, os imprime e depois o libera corretamente.

#include <stdio.h>
#include <stdlib.h>

typedef struct { int *data; size_t len, cap; } Vec;

int vec_push(Vec *v, int value) {
    if (v->len == v->cap) {
        size_t nc = v->cap ? v->cap * 2 : 4;
        int *tmp = realloc(v->data, nc * sizeof(*v->data));
        if (!tmp) return -1;
        v->data = tmp; v->cap = nc;
    }
    v->data[v->len++] = value;
    return 0;
}

int main(void) {
    Vec v = {0};
    for (int i = 0; i < 5; i++) vec_push(&v, i * 10);
    for (size_t i = 0; i < v.len; i++) printf("%d\n", v.data[i]);
    free(v.data);
    return 0;
}

Inicializando com zero usando {0}

Escrever Vec v = {0}; define todos os campos como zero, inclusive o ponteiro de dados como NULL.

Esse é um atalho prático que deixa um vetor pronto para vec_push sem chamar uma função de inicialização explícita.

Vec v = {0};      /* data=NULL, len=0, cap=0 */
vec_push(&v, 42);

Um auxiliar get seguro

Acessar um índice além de len é um erro. Um pequeno acessador pode verificar os limites e sinalizar erros, trocando um pouco de velocidade por segurança.

int vec_get(const Vec *v, size_t i, int *out) {
    if (i >= v->len) return -1;   /* out of range */
    *out = v->data[i];
    return 0;
}

Por que acompanhar len e cap separadamente

cap indica quanta memória está alocada; len indica quanto dela está sendo efetivamente usado.

Manter capacidade sobrando significa que a maioria das inserções não chama realloc. Essa separação é o que torna um vetor rápido e flexível.

Generalizando o tipo

Este vetor armazena int. Para armazenar outros tipos, o senhor pode alterar o tipo do elemento ou armazenar void * junto com o tamanho do elemento.

O padrão — inicialização, inserção e liberação — permanece o mesmo, independentemente do que for armazenado.

typedef struct {
    double *data;
    size_t  len, cap;
} DVec;   /* same shape, different element type */

Verificação rápida

Teste sua compreensão do tipo vetor.

Recapitulação

Um vetor reúne um ponteiro de dados, len e cap em uma única struct.

vec_push dobra a capacidade quando o vetor está cheio, vec_free libera o buffer e redefine os campos, e {0} faz a inicialização corretamente. Esse padrão reutilizável é melhor do que gerenciar variáveis dispersas. A seguir: liberar corretamente e evitar vazamentos.

Perguntas Frequentes

A aula “Um tipo de vetor reutilizável” é grátis?

Sim — o texto completo de “Um tipo de vetor reutilizável” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C Academy, atualize para CoddyKit PRO. O curso de C Academy inclui 4 aulas no total.

O que vou aprender em “Um tipo de vetor reutilizável”?

Envolva tamanho e capacidade. Você pratica C Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar C Academy?

Nenhuma experiência prévia é necessária. C Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.

Quanto tempo leva a aula “Um tipo de vetor reutilizável”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de C Academy?

Sim. Cada aula de C Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Alocando um vetor
  2. Aumentando com realloc
  3. Um tipo de vetor reutilizável
  4. Liberando memória e evitando vazamentos
← Voltar para C Academy