Provided by: manpages-de-dev_2.5-1_all bug

BEZEICHNUNG

       malloc, free, calloc, realloc - dynamischen Speicher belegen und freigeben

ÜBERSICHT

       #include <stdlib.h>

       void *malloc(size_t size);
       void free(void *ptr);
       void *calloc(size_t nmemb, size_t size);
       void *realloc(void *ptr, size_t size);
       void *reallocarray(void *ptr, size_t nmemb, size_t size);

   Mit Glibc erforderliche Makros (siehe feature_test_macros(7)):

       reallocarray():
           _GNU_SOURCE

BESCHREIBUNG

       malloc()  belegt  size Byte und gibt einen Zeiger auf den belegten Speicherbereich zurück.
       Der Speicher wird nicht initialisiert. Falls size  0  ist,  wird  malloc()  entweder  NULL
       zurückgeben  oder einen eindeutigen Zeigerwert, der später erfolgreich an free() übergeben
       werden kann.

       free() gibt den Speicher frei, auf den ptr zeigt, welcher von einem  früheren  Aufruf  von
       malloc(), calloc() oder realloc() belegt worden sein muss. Andernfalls oder wenn free(ptr)
       bereits aufgerufen wurde, ist das Verhalten nicht definiert. Wenn ptr NULL ist, wird keine
       Operation ausgeführt.

       calloc()  belegt Speicher für ein Array von nmemb Elementen von jeweils size Byte und gibt
       einen Zeiger auf den belegten Speicherbereich zurück. Der Speicher wird auf Null  gesetzt.
       Falls  nmemb  oder  size  0 ist, gibt calloc() entweder NULL zurück oder einen eindeutigen
       Zeigerwert, der später erfolgreich an free() übergeben werden kann.

       realloc() ändert die Größe des Speicherblocks, auf den  ptr  zeigt,  auf  size  Byte.  Der
       Inhalt  bleibt  unverändert im Bereich vom Anfang des Speicherbereichs bis zum Minimum von
       alter und neuer Größe. Falls die neue Größe die alte überschreitet, wird  der  zusätzliche
       Speicher  nicht  initialisiert.  Falls  ptr  gleich NULL ist, ist der Aufruf äquivalent zu
       malloc(size); falls die Größe gleich Null ist und ptr ist von NULL  verschieden,  ist  der
       Aufruf äquivalent zu free(ptr). Wenn ptr nicht NULL ist, muss er von einem früheren Aufruf
       von malloc(), calloc() oder realloc() zurückgegeben worden sein. Falls  der  Bereich,  auf
       den verwiesen wurde, verschoben wurde, wird free(ptr) aufgerufen.

       Die  Funktion reallocarray() ändert die Größe des Speicherblocks, auf den ptr zeigt, damit
       er groß genug für ein Feld von nmemb  Elementen  mit  jeweils  size  bytes  ist.  Sie  ist
       äquivalent zu dem Aufruf:

               realloc(ptr, nmemb * size);

       Allerdings  schlägt  reallocarray(),  anders als obiger Aufruf von realloc(), sicher fehl,
       wenn  die  Multiplikation  überliefe.  Falls  solch   ein   Überlauf   auftritt,   liefert
       reallocarray()  NULL,  setzt  errno  auf ENOMEM und lässt den ursprünglichen Speicherblock
       unverändert.

RÜCKGABEWERT

       Die Funktionen malloc() und calloc() liefern einen Zeiger auf den  reservierten  Speicher,
       der geeignet für jeden eingebauten Typ ausgerichtet ist. Tritt ein Fehler auf, geben diese
       Funktionen NULL zurück. NULL kann auch durch einen erfolgreichen Aufruf von  malloc()  mit
       einer size von Null oder durch einen erfolgreichen Aufruf von calloc() mit nmemb oder size
       gleich Null zurückgegeben werden.

       Die Funktion free() gibt keinen Wert zurück.

       Die Funktion realloc() gibt einen Zeiger auf den neu belegten Speicher zurück, welcher für
       jeden  eingebauten  Typ passend ausgerichtet ist und sich von ptr unterscheiden kann, oder
       NULL falls die Anforderung scheitert. Falls size gleich 0 war, wird entweder NULL oder ein
       für  die  Übergabe  an  free()  geeigneter Zeiger zurückgegeben. Wenn realloc() scheitert,
       bleibt der ursprüngliche Block unverändert - er wird nicht freigegeben oder verändert.

       Im Erfolgsfall liefert die Funktion reallocarray()  einen  Zeiger  auf  den  neu  belegten
       Speicher  zurück.  Beim  Fehlschlag  liefert  sie NULL und der ursprüngliche Speicherblock
       bleibt unverändert.

FEHLER

       calloc(),  malloc(),  realloc()  und  reallocarray()  können  mit  den  folgenden  Fehlern
       fehlschlagen:

       ENOMEM Speicher  erschöpft.  Möglicherweise  erreichte  die  Anwendung die in getrlimit(2)
              beschriebene Grenze RLIMIT_AS oder RLIMIT_DATA.

ATTRIBUTE

       Siehe attributes(7) für eine Erläuterung der in diesem Abschnitt verwandten Ausdrücke.

       ┌─────────────────────┬───────────────────────┬─────────┐
       │SchnittstelleAttributWert    │
       ├─────────────────────┼───────────────────────┼─────────┤
       │malloc(), free(),    │ Multithread-Fähigkeit │ MT-Safe │
       │calloc(), realloc()  │                       │         │
       └─────────────────────┴───────────────────────┴─────────┘

KONFORM ZU

       malloc(), free(), calloc(), realloc(): POSIX.1-2001, POSIX.1-2008, C89, C99.

       reallocarray() ist eine nicht standardisierte Erweiterung, die erstmals in OpenBSD 5.6 und
       FreeBSD 11.0 erschien.

ANMERKUNGEN

       Standardmäßig  verfolgt  Linux eine optimistische Strategie bei der Speicherzuweisung. Das
       bedeutet nicht, dass der Speicher garantiert verfügbar ist, wenn malloc() einen  von  NULL
       verschiedenen  Zeiger zurück gibt. Falls es sich herausstellt, dass das System über keinen
       freien Speicher verfügt, werden ein oder mehrere Prozesse vom »OOM  Killer«  beendet.  Für
       weitere  Informationen  siehe  die  Beschreibung  von  /proc/sys/vm/overcommit_memory  und
       /proc/sys/vm/oom_adj      in      proc(5)      sowie      die      Linux-Kernel-Quelldatei
       Documentation/vm/overcommit-accounting.

       Normally,  malloc()   allocates  memory from the heap, and adjusts the size of the heap as
       required, using sbrk(2). When allocating  blocks  of  memory  larger  than  MMAP_THRESHOLD
       bytes,  the  glibc  malloc()   implementation  allocates the memory as a private anonymous
       mapping using mmap(2). MMAP_THRESHOLD is  128 kB  by  default,  but  is  adjustable  using
       mallopt(3).  Prior to Linux 4.7 allocations performed using mmap(2) were unaffected by the
       RLIMIT_DATA resource limit; since Linux 4.7, this limit is also enforced  for  allocations
       performed using mmap(2).

       Um Verfälschungen in Multithread-Anwendungen zu vermeiden, werden intern Mutexe zum Schutz
       der Speicherverwaltungs-Datenstrukturen eingesetzt,  die  von  diesen  Funktionen  genutzt
       werden.  In  einer  Multithread-Anwendung, in denen Threads gleichzeitig Speicher zuweisen
       und freigeben, könnte es Zugangskonflikte für diese Mutexe geben. Um die Speicherzuweisung
       in  Multithread-Anwendungen  skalierbar  zu  bewältigen,  erzeugt Glibc zusätzliche memory
       allocation  arenas,  wenn  Mutex-Konflikte  entdeckt  wird.  Jede  Arena  ist  eine  große
       Speicherregion, die intern vom System (mit brk(2) oder mmap(2)) zugeordnet und mit eigenen
       Mutexen verwaltet wird.

       SUSv2 fordert von malloc(), calloc() und realloc()  im  Fehlerfall  errno  auf  ENOMEM  zu
       setzen.  Glibc  geht  davon  aus,  dass  das  getan  wurde (und die Glibc-Versionen dieser
       Routinen tun es). Wenn Sie eine private Implementierung von malloc  verwenden,  die  errno
       nicht setzt, können bestimmte Bibliotheksroutinen ohne einen Grund in errno fehlschlagen.

       Abstürze  in  malloc(),  calloc(), realloc() oder free() haben nahezu immer einen Bezug zu
       einem beschädigten Heap, wie z.B. eine Nutzung  von  mehr  als  dem  zugeordneten  Bereich
       (overflowing) oder die doppelte Freigabe eines Zeigers.

       Die  malloc()-Implementierung kann über Umgebungsvariablen eingestellt werden. Für Details
       siehe mallopt(3).

SIEHE AUCH

       valgrind(1), brk(2), mmap(2), alloca(3), malloc_get_state(3), malloc_info(3),
       malloc_trim(3), malloc_usable_size(3), mallopt(3), mcheck(3), mtrace(3), posix_memalign(3)

KOLOPHON

       Diese Seite ist Teil der Veröffentlichung 4.15 des Projekts Linux-man-pages. Eine
       Beschreibung des Projekts, Informationen, wie Fehler gemeldet werden können sowie die
       aktuelle Version dieser Seite finden sich unter https://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG

       Die deutsche Übersetzung dieser Handbuchseite wurde von Martin Eberhard Schauer
       <Martin.E.Schauer@gmx.de>, Mario Blättermann <mario.blaettermann@gmail.com> und Helge
       Kreutzmann <debian@helgefjell.de> erstellt.

       Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License
       Version 3 oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG
       übernommen.

       Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-
       Mail an <debian-l10n-german@lists.debian.org>.