0Pricing
C Academy · Lektion

Ein wiederverwendbarer Vektortyp

Kapseln Sie Größe und Kapazität.

Ein wiederverwendbarer Vektortyp ist eine kostenlose C Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C Academy-Kurs umfasst insgesamt 4 Lektionen.

Von losem Code zu einem Typ

Einen Pointer, eine Anzahl und eine Kapazität als drei separate Variablen weiterzugeben, ist fehleranfällig.

Bündeln wir sie in einer struct: einem wiederverwendbaren dynamischen Array, das häufig als Vektor bezeichnet wird. Dadurch werden die Daten und die zugehörigen Verwaltungsinformationen gemeinsam gekapselt.

Die Vektor-Struct

Ein Vektor benötigt drei Felder: einen Pointer auf die Daten, die Anzahl der verwendeten Elemente (len) und die Anzahl der Elemente, für die Platz vorhanden ist, bevor eine Größenänderung nötig wird (cap).

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

Einen Vektor initialisieren

Ein leerer Vektor hat einen NULL-Datenpointer sowie die Länge und Kapazität 0. Eine kleine Init-Funktion macht die Absicht deutlich.

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

Die Push-Operation

vec_push fügt am Ende ein Element hinzu. Wenn der Vektor voll ist, verdoppelt die Funktion zuvor die Kapazität.

Bei Erfolg gibt sie 0 zurück, bei einem Fehlschlag der Speicherallokation -1, sodass der Aufrufer entsprechend reagieren kann.

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;
}

Elemente wieder auslesen

Da len die Anzahl der verwendeten Elemente angibt, durchlaufen Sie die Elemente von 0 bis len - 1. Die Kapazität kann größer sein, aber diese zusätzlichen Plätze gehören noch nicht zu Ihren Daten.

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

Den Vektor freigeben

Ein Vektor besitzt seinen Heap-Puffer und benötigt daher eine passende Bereinigungsfunktion. Setzen Sie die Felder nach dem Freigeben zurück, damit die Struct nicht versehentlich falsch verwendet werden kann.

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

Alles zusammenführen

Dieses vollständige Programm erstellt einen Vektor, fügt fünf Werte hinzu, gibt sie aus und gibt den Vektor anschließend ordnungsgemäß frei.

#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;
}

Mit {0} auf null initialisieren

Vec v = {0}; setzt jedes Feld auf null, einschließlich des Datenpointers auf NULL.

Das ist eine praktische Abkürzung, mit der ein Vektor für vec_push bereit ist, ohne eine explizite Init-Funktion aufzurufen.

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

Eine sichere get-Hilfsfunktion

Ein Zugriff hinter len hinaus ist ein Fehler. Ein kleiner Accessor kann die Grenzen prüfen und Fehler melden – auf Kosten eines kleinen Teils der Geschwindigkeit, aber mit höherer Sicherheit.

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;
}

Warum len und cap getrennt verfolgt werden

cap gibt an, wie viel Speicher allokiert ist; len gibt an, wie viel davon tatsächlich verwendet wird.

Durch die Reservekapazität benötigen die meisten Push-Operationen keinen Aufruf von realloc. Diese Trennung macht einen Vektor zugleich schnell und flexibel.

Den Typ verallgemeinern

Dieser Vektor speichert int-Werte. Um andere Typen aufzunehmen, können Sie den Elementtyp ändern oder void * zusammen mit einer Elementgröße speichern.

Das Muster – init, push, free – bleibt unabhängig von den gespeicherten Daten gleich.

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

Kurzer Test

Testen Sie Ihr Verständnis des Vektortyps.

Zusammenfassung

Ein Vektor bündelt einen Datenpointer, len und cap in einer Struct.

vec_push verdoppelt die Kapazität, wenn der Vektor voll ist, vec_free gibt den Puffer frei und setzt die Felder zurück, und {0} initialisiert sauber. Dieses wiederverwendbare Muster ist besser, als lose Variablen einzeln zu verwalten. Als Nächstes geht es darum, Speicher korrekt freizugeben und Leaks zu vermeiden.

Häufig gestellte Fragen

Ist die Lektion „Ein wiederverwendbarer Vektortyp“ kostenlos?

Ja — der vollständige Text von „Ein wiederverwendbarer Vektortyp“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Ein wiederverwendbarer Vektortyp“?

Kapseln Sie Größe und Kapazität. Du übst C Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um C Academy zu starten?

Keine Vorkenntnisse erforderlich. C Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.

Wie lange dauert die Lektion „Ein wiederverwendbarer Vektortyp“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser C Academy-Lektion Code schreiben und ausführen?

Ja. Jede C Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Ein Array allozieren
  2. Mit realloc vergrößern
  3. Ein wiederverwendbarer Vektortyp
  4. Freigeben und Leaks vermeiden
← Zurück zu C Academy