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
- Alocando um vetor
- Aumentando com realloc
- Um tipo de vetor reutilizável
- Liberando memória e evitando vazamentos