malloc(3) Library Functions Manual malloc(3) BEZEICHNUNG malloc, free, calloc, realloc, reallocarray - dynamischen Speicher belegen und freigeben BIBLIOTHEK Standard-C-Bibliothek (libc, -lc) UBERSICHT #include void *malloc(size_t Grosse); void free(void *_Nullable zeiger); void *calloc(size_t nmemb, size_t Grosse); void *realloc(void *_Nullable zeiger, size_t Grosse); void *reallocarray(void *_Nullable zeiger, size_t nmemb, size_t Grosse); Mit Glibc erforderliche Feature-Test-Makros (siehe feature_test_macros(7)): reallocarray(): Seit Glibc 2.29: _DEFAULT_SOURCE Glibc 2.28 und alter: _GNU_SOURCE BESCHREIBUNG malloc() Die Funktion malloc() belegt Grosse Byte und gibt einen Zeiger auf den belegten Speicherbereich zuruck. Der Speicher wird nicht initialisiert. Falls Grosse 0 ist, wird malloc() einen eindeutigen Zeigerwert zuruckgeben, der spater erfolgreich an free() ubergeben werden kann. (Siehe >>Nichtportables Verhalten<< fur Portabilitats-Probleme.) free() free() gibt den Speicher frei, auf den zeiger zeigt, welcher von einem fruheren Aufruf von malloc() oder verwandten Funktionen belegt worden sein muss. Andernfalls oder wenn zeiger bereits freigegeben wurde, ist das Verhalten nicht definiert. Wenn zeiger NULL ist, wird keine Operation ausgefuhrt. calloc() Die Funktion calloc() belegt Speicher fur ein Feld von nmemb Elementen der jeweiligen Grosse Grosse und liefert einen Zeiger auf den belegten Speicher zuruck. Der Speicher wird auf 0 gesetzt. Falls nmemb oder Grosse 0 ist, wird calloc() einen eindeutigen Zeigerwert zuruckgeben, der spater erfolgreich an free() ubergeben werden kann. Falls die Multiplikation von nmemb und Grosse zu einem Ganzzahluberlauf fuhren wurde, dann liefert calloc() einen Fehler zuruck. Im Gegensatz dazu wurde ein Ganzzahluberlauf in dem nachfolgenden Aufruf von malloc() nicht erkannt werden, was zu einer Zuweisung eines Speicherblocks mit falscher Grosse fuhren wurde: malloc(nmemb * Grosse); realloc() realloc() andert die Grosse des Speicherblocks, auf den zeiger zeigt, auf Grosse Byte. Der Inhalt des Speichers bleibt im Bereich vom Anfang des Speicherbereichs bis zum Minimum von alter und neuer Grosse unverandert. Falls die neue Grosse die alte uberschreitet, wird der zusatzliche Speicher nicht initialisiert. Falls zeiger gleich NULL ist, ist der Aufruf aquivalent zu malloc(Grosse). falls die Grosse gleich Null und zeiger von NULL verschieden ist, ist der Aufruf aquivalent zu free(zeiger) (siehe aber >>Nichtportables Verhalten<< fur Portabilitats-Probleme.) Wenn zeiger nicht NULL ist, muss er von einem fruheren Aufruf von malloc() oder verwandten Funktionen zuruckgegeben worden sein. Falls der Bereich, auf den verwiesen wurde, verschoben wurde, wird free(zeiger) aufgerufen. reallocarray() Die Funktion reallocarray() andert die Grosse des Speicherblocks, auf den zeiger zeigt, (und verschiebt ihn moglicherweise,) damit er gross genug fur ein Feld von nmemb Elementen mit jeweils Grosse Byte ist. Sie ist aquivalent zu dem Aufruf: realloc(zeiger, nmemb * Grosse); Allerdings schlagt reallocarray(), anders als obiger Aufruf von realloc(), sicher fehl, wenn die Multiplikation uberliefe. Falls solch ein Uberlauf auftritt, liefert reallocarray() einen Fehler zuruck. RUCKGABEWERT Die Funktionen malloc(), calloc(), realloc() und reallocarray() liefern einen Zeiger auf den reservierten Speicher, der geeignet fur jeden Typ, der in die angeforderte Grosse oder weniger passt, ausgerichtet ist. Tritt ein Fehler auf, geben diese Funktionen NULL zuruck und setzen errno. Versuche, mehr als PTRDIFF_MAX byte zu belegen, wird als ein Fehler betrachtet, da ein Objekt dieser Grosse bei spaterer Zeigersubtraktion zu einem Uberlauf fuhren konnte. Die Funktion free() gibt keinen Wert zuruck und erhalt errno. Die Funktionen realloc() und reallocarray() liefern NULL zuruck, falls zeiger nicht NULL ist und die angeforderte Grosse Null ist; dies wird nicht als Fehler betrachtet. (Siehe >>Nichtportables Verhalten<< fur Portabilitats-Probleme.) Andernfalls kann der zuruckgelieferte Zeiger zu zeiger identisch sein, falls die Belegung nicht verschoben wurde (z.B. weil genug Platz vorhanden war, um die Belegung am Ort selbst zu vergrossern) oder sich von zeiger unterscheiden, falls die Belegung an eine neue Adresse verschoben wurde. Wenn diese Funktionen scheitern, bleibt der ursprungliche Block unverandert - er wird nicht freigegeben oder verschoben. FEHLER calloc(), malloc(), realloc() und reallocarray() konnen mit den folgenden Fehlern fehlschlagen: ENOMEM Speicher erschopft. Moglicherweise erreichte die Anwendung die in getrlimit(2) beschriebene Grenze RLIMIT_AS oder RLIMIT_DATA. Ein anderer Grund konnte sein, dass die Anzahl der durch den aufrufenden Prozess erstellten Mappings die durch /proc/sys/vm/max_map_count festgelegte Grenze uberschritten hat. ATTRIBUTE Siehe attributes(7) fur eine Erlauterung der in diesem Abschnitt verwandten Ausdrucke. +--------------------------------+-------------------------+-----------+ |Schnittstelle | Attribut | Wert | +--------------------------------+-------------------------+-----------+ |malloc(), free(), calloc(), | Multithread-Fahigkeit | MT-Sicher | |realloc() | | | +--------------------------------+-------------------------+-----------+ STANDARDS malloc() free() calloc() realloc() C11, POSIX.1-2008. reallocarray() Keine. GESCHICHTE malloc() free() calloc() realloc() POSIX.1-2001, C89. reallocarray() Glibc 2.26. OpenBSD 5.6, FreeBSD 11.0. malloc() und verwandte Funktionen lehnen seit Glibc 2.30 Grossen grosser als PTRDIFF_MAX ab. Seit Glibc 2.33 erhalt free() errno. ANMERKUNGEN Standardmassig verfolgt Linux eine optimistische Strategie bei der Speicherzuweisung. Das bedeutet nicht, dass der Speicher garantiert verfugbar ist, wenn malloc() einen von NULL verschiedenen Zeiger zuruck gibt. Falls es sich herausstellt, dass das System uber keinen freien Speicher verfugt, werden ein oder mehrere Prozesse vom OOM-Killer getotet. Fur 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 Grosse des Heaps mittels sbrk(2) an. Bei der Zuweisung von Speicherblocken grosser als MMAP_THRESHOLD Bytes reserviert die Glibc-Implementierung von malloc() mithilfe von mmap(2) den Speicher als ein privates anonymes Mapping. MMAP_THRESHOLD ist standardmassig 128 kB, kann aber mittels mallopt(3) angepasst werden. Vor Linux 4.7 waren Reservierungen unter Verwendung von mmap(2) von der Ressourcenbeschrankung RLIMIT_DATA nicht betroffen; seit Linux 4.7 wird diese Beschrankung auch bei Reservierungen mittels mmap(2) durchgesetzt. Um Verfalschungen 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, konnte es Zugangskonflikte fur diese Mutexe geben. Um die Speicherzuweisung in Multithread-Anwendungen skalierbar zu bewaltigen, erzeugt Glibc zusatzliche memory allocation arenas, wenn Mutex-Konflikte entdeckt wird. Jede Arena ist eine grosse Speicherregion, die intern vom System (mit brk(2) oder mmap(2)) zugeordnet und mit eigenen Mutexen verwaltet wird. Falls Ihr Programm einen privaten Speicher-Zuordner verwendet, sollte dies so erfolgen, dass malloc(), free(), calloc() und realloc() ersetzt werden. Die Ersatzfunktionen mussen das dokumentierte Glibc-Verhalten implementieren, einschliesslich der Handhabung von errno, Belegungen der Grosse Null und der Prufungen auf Uberlauf; andernfalls konnten andere Bibliotheksroutinen absturzen oder falsch funktionieren. Falls der Ersatz fur free() beispielsweise errno nicht erhalt, dann konnten Bibliotheksfunktionen, die scheinbar keinen Bezug dazu haben, fehlschlagen, ohne einen gultigen Grund in errno anzugeben. Private Speicher-Zuordner konnten es auch notwendig machen, andere Glibc-Funktionen zu ersetzen; siehe >>Replacing malloc<< im Handbuch der Glibc fur Details. Absturze in Speicher-Zuordner haben nahezu immer einen Bezug zu einem beschadigten Heap, wie z.B. eine Nutzung von mehr als dem zugeordneten Bereich (overflowing) oder die doppelte Freigabe eines Zeigers. Die malloc()-Implementierung kann uber Umgebungsvariablen eingestellt werden. Fur Details siehe mallopt(3). Nichtportierbares Verhalten Das Verhalten dieser Funktionen, wenn die angeforderte Grosse Null ist, ist Glibc-spezifisch; andere Implementierungen konnten NULL zuruckliefern ohne errno zu setzen. Portierbare POSIX-Programme sollten solches Verhalten zulassen. Siehe realloc(3p). POSIX verlangt von Speicher-Zuordnern, dass sie beim Fehlschlag errno setzten. Allerdings verlangt der C-Standard dies nicht und Anwendungen, die auf nicht-POSIX-Plattformen portierbar sein sollen, sollten dies nicht voraussetzen. Portierbare Programme sollten keine privaten Speicher-Zuordner verwenden, da POSIX und der C-Standard keinen Ersatz fur malloc(), free(), calloc() und realloc() erlauben. BEISPIELE #include #include #include #include #include #define MALLOCARRAY(n, type) ((type *) my_mallocarray(n, sizeof(type))) #define MALLOC(type) MALLOCARRAY(1, type) static inline void *my_mallocarray(size_t nmemb, size_t size); int main(void) { char *p; p = MALLOCARRAY(32, char); if (p == NULL) err(EXIT_FAILURE, "malloc"); strlcpy(p, "foo", 32); puts(p); } static inline void * my_mallocarray(size_t nmemb, size_t size) { return reallocarray(NULL, nmemb, size); } 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) Fur Details uber die GNU-C-Bibliotheksimplementierung, siehe . UBERSETZUNG Die deutsche Ubersetzung dieser Handbuchseite wurde von Martin Eberhard Schauer , Mario Blattermann und Helge Kreutzmann erstellt. Diese Ubersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezuglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG ubernommen. Wenn Sie Fehler in der Ubersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Ubersetzer . Linux man-pages 6.06 31. Oktober 2023 malloc(3)