C-Programmierung

Memset, Realloc, etc.

Speicherverwaltung: Free | | Sieb des Eratosthenes

Arrays von beliebigen Datentypen lassen sich über die Größe des belegten Speicherbereichs allozieren.

#include <assert.h>
#include <stdlib.h>

int *ptr;
int n=1000;

assert(ptr=(int *)malloc(n*sizeof(int)));

Bemerkung: Die Speicherallozierung kostet Rechenzeit, man sollte so wenige malloc-Aufrufe wie möglich benutzen, also immer einen möglichst großen Block auf einmal allozieren.

Ein undefinierter Speicherbereich läßt sich mit der Funktion memset() vorbelegen:

void memset(void *b, int c, size_t n); /* signature */
memset(ptr, 0, n*sizeof(int));

Alternativ reserviert die Funktion calloc() Speicher und initialisert ihn auf 0:

void *calloc(size_t count, size_t size); /* signature */
assert(ptr=(int *)calloc(n, sizeof(int));

Die Größe läßt sich zur Laufzeit mit der Funktion realloc() anpassen:

void *realloc(void *ptr, size_t size); /* signature */
int m=2*n;

assert(ptr=(int *)realloc(ptr, m*sizeof(int)));

Hinweis: realloc(NULL, ...) entspricht malloc(...)

Der Inhalt des vorhandenen Speicherbereichs bleibt erhalten. Die Adresse kann sich ändern, wenn der Inhalt umkopiert werden muss. Der Inhalt des dazugekommenen Speichers ist undefiniert.

Der undefinierte Speicherbereich kann mit der Funktion memcpy() kopiert werden:

void memcpy(void *s1, const void *s2, size_t n); /* signature */
memcpy(&ptr[n], ptr, n*sizeof(int));

Fallgrube: Die beiden zu kopierenden Speicherbereiche dürfen sich nicht überlappen, sonst bedarf es der memmove() Funktion.

Speicherverwaltung: Free | | Sieb des Eratosthenes

Options: