Provided by: manpages-de-dev_4.13-4_all bug

BEZEICHNUNG

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

ÜBERSICHT

       #include <stdlib.h>

       void *malloc(size_t Größe);
       void free(void *ptr);
       void *calloc(size_t nmemb, size_t Größe);
       void *realloc(void *ptr, size_t Größe);
       void *reallocarray(void *ptr, size_t nmemb, size_t Größe);

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

       reallocarray():
           Seit Glibc 2.29:
               _DEFAULT_SOURCE
           Glibc 2.28 und älter:
               _GNU_SOURCE

BESCHREIBUNG

       Die  Funktion  malloc()  belegt  Größe  Byte  und  gibt  einen  Zeiger  auf  den  belegten
       Speicherbereich zurück. Der Speicher wird nicht initialisiert. Falls  Größe  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 Feld von nmemb Elementen von jeweils Größe Byte und gibt
       einen Zeiger auf den belegten Speicherbereich zurück. Der Speicher wird auf Null  gesetzt.
       Falls  nmemb  oder  Größe 0 ist, gibt calloc() entweder NULL zurück oder einen eindeutigen
       Zeigerwert,  der  später  erfolgreich  an  free()  übergeben  werden   kann.   Falls   die
       Multiplikation  von  nmemb  und Größe zu einem Ganzzahlüberlauf führen würde, dann liefert
       calloc() einen Fehler  zurück.  Im  Gegensatz  dazu  würde  ein  Ganzzahlüberlauf  in  dem
       nachfolgenden  Aufruf  von  malloc()  nicht  erkannt  werden, was zu einer Zuweisung eines
       Speicherblocks mit falscher Größe führen würde:

           malloc(nmemb * Größe);

       realloc() ändert die Größe des Speicherblocks, auf den ptr  zeigt,  auf  Größe  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(Größe); 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  Größe  Byte  ist.  Sie  ist
       äquivalent zu dem Aufruf:

               realloc(ptr, nmemb * Größe);

       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  Größe  von  Null  oder durch einen erfolgreichen Aufruf von calloc() mit nmemb oder
       Größe 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 oder NULL, falls die Anfrage fehlschlug.
       Der zurückgelieferte  Zeiger  kann  zu  ptr  identisch  sein,  falls  die  Belegung  nicht
       verschoben  wurde  (z.B.  weil genug Platz vorhanden war, um die Belegung am Ort selbst zu
       vergrößern) oder sich von ptr unterscheiden, falls  die  Belegung  an  eine  neue  Adresse
       verschoben  wurde.  Falls Größe 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.

VERSIONEN

       reallocarray() kam erstmals in Glibc 2.26 vor.

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 getötet. 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.rst.

       Normalerweise stellt malloc() Speicher auf dem Heap bereit und passt je  nach  Bedarf  die
       Größe  des  Heaps  mittels  sbrk(2)  an.  Bei der Zuweisung von Speicherblöcken größer als
       MMAP_THRESHOLD Bytes  reserviert  die  Glibc-Implementierung  von  malloc()  mithilfe  von
       mmap(2)  den  Speicher als ein privates anonymes Mapping. MMAP_THRESHOLD ist standardmäßig
       128 kB, kann aber mittels mallopt(3) angepasst werden. Vor Linux 4.7 waren  Reservierungen
       unter  Verwendung  von mmap(2) von der Ressourcenbeschränkung RLIMIT_DATA nicht betroffen;
       seit  Linux  4.7  wird  diese  Beschränkung  auch  bei  Reservierungen   mittels   mmap(2)
       durchgesetzt.

       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)

       Für Details über die GNU-C-Bibliotheksimplementierung, siehe
       ⟨https://sourceware.org/glibc/wiki/MallocInternals⟩.

KOLOPHON

       Diese Seite ist Teil der Veröffentlichung 5.10 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 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ 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 die Mailingliste der Übersetzer ⟨debian-l10n-german@lists.debian.org⟩.