Unter welchen Umständen kann Malloc NULL zurückgeben?
Es ist mir noch nie passiert, und ich habe die Programmierung nun schon seit Jahren.
Kann mir jemand ein Beispiel für eine nicht-triviale Programm, in dem malloc
wird tatsächlich nicht funktionieren?
Ich spreche nicht über die Speicher erschöpft: ich bin auf der Suche nach den einfachen Fall, wenn Sie die Zuweisung nur eines Speicherblocks in eine gebundene Größe, die gegeben wird durch die Benutzer, können sagen, ein integer, Ursachen malloc
zu scheitern.
Kommentar zu dem Problem
Für die meisten Antworten in unter 2 Minuten-Preis hier 🙂
@MichaelDorgan - vielleicht ist es einfach für Sie, aber alle meine nicht-trivialen apps mit malloc Probleme wurden an Kunden ausgeliefert und damit bin ich nicht frei, Sie zu posten 🙂
Wenn Sie reservieren ein einzelner block der Größe begrenzt, und Ihr gebunden ist klein genug, kann das system immer die Erinnerung, natürlich wird es immer gelingt. In diesem Fall, obwohl, Ihre eins-Zuordnung Spielzeug-Programm ist trivial.
Lol - Gearbeitet, die auf handheld-Plattformen für so viele Jahre, dass NULL von malloc ist ganz einfach für mich zu erreichen.
@Nutzlos - wenn du ein Speicherleck im Laufe der Zeit, oder einfach nur fragment es wie verrückt, kein malloc jeder Größe ist jemals ganz sicher sein.
InformationsquelleAutor der Frage RanZilber | 2012-02-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja.
Nur versuchen zu
malloc
mehr Speicher, als Ihr system bieten kann (entweder durch Ausschöpfung Ihrer Adressraum, oder den virtuellen Speicher - je nachdem was kleiner ist).wird es vermutlich tun. Wenn nicht, wiederholen Sie ein paar mal, bis Sie laufen aus.
InformationsquelleAutor der Antwort Useless
Die Sie brauchen, um einige Arbeit zu tun in embedded-Systemen, werden Sie Häufig erhalten NULL zurückgegeben, die es gibt 🙂
Ist es viel schwerer zu laufen, aus dem Speicher in modernen Massiv-Adresse-Raum-und-sichern-speichern-Systeme, aber immer noch durchaus möglich, in applcations, wo Sie verarbeiten große Mengen von Daten, wie z.B. GIS-oder in-memory-Datenbanken, oder an Orten, wo Sie Ihren buggy code führt zu einem Speicherverlust.
Aber es ist wirklich egal, ob Sie noch nie erlebt haben, bevor - der standard sagt, dass es passieren kann, so sollte man gerecht werden. Ich habe nicht von einem Auto getroffen, in den vergangenen Jahrzehnten entweder aber das bedeutet nicht, dass ich Wandern durch die Straßen, ohne sich zuerst.
- Und re-edit:
sehr definition der Speicher erschöpft ist
malloc
nicht geben Sie den gewünschten Raum. Es ist unerheblich, ob das ist verursacht durch die Zuweisung aller verfügbaren Speicher oder heap-Fragmentierung bedeutet, dass Sie nicht einen zusammenhängenden block, obwohl die Summe aller freien Blöcke in den Speicher arena höher ist, oder künstlich begrenzen Ihre Adresse Speicherplatz-Nutzung Z über die Standard-konforme Funktion:C-standard unterscheidet nicht zwischen Modi scheitern, nur, dass es erfolgreich ist oder fehlschlägt.
InformationsquelleAutor der Antwort paxdiablo
Jedem Programm in c geschrieben, das muss dynamisch mehr Speicher zuzuweisen, als der OS derzeit erlaubt.
Zum Spaß, wenn Sie mit ubuntu geben
Jedem Programm, das Sie laufen wird wahrscheinlich Absturz (durch einen malloc-Fehler) wie hast du Sie begrenzt die Größe des verfügbaren Speichers zu einem Prozess zu einem markigen Menge.
InformationsquelleAutor der Antwort RussS
Einfach mal die manual-Seite von
malloc
.InformationsquelleAutor der Antwort starrify
Es sei denn, dein Speicher ist bereits vollständig reserviert (oder stark fragmentiert), der einzige Weg, um
malloc()
Gegenzug eineNULL
-Zeiger ist der Antrag, der Raum von size zero:Zitieren aus dem C99-standard, §7.20.3, Unterabschnitt 1:
In anderen Worten,
malloc(0)
möglicherweise einNULL
-Zeiger oder einen gültigen Zeiger auf null zugewiesen bytes.InformationsquelleAutor der Antwort Philip
Da Sie fragte nach einem Beispiel, hier ist ein Programm, wird (schließlich) sehen
malloc
zurückNULL
:Was? Sie mag es nicht absichtlich verwirrend geschriebener code? 😉 (Wenn es läuft für ein paar Minuten und stürzt nicht ab auf Ihrer Maschine, vernichten, ändern
999
zu einer größeren Anzahl und versuchen Sie es erneut.)EDIT: Wenn es nicht klappt, egal, wie groß die Zahl ist, was dann passiert ist, dass das system sagt: "Hier ist eine Erinnerung!", aber so lange, wie Sie nicht versuchen, es zu benutzen, es wird nicht zugeteilt. In dem Fall:
Sollte den trick tun. Wenn wir verwenden können, GCC-Erweiterungen, ich denke, wir können es bekommen, auch kleinere, durch die wechselnden
char*p;void*malloc();
zuvoid*p,*malloc();
aber wenn Sie wirklich wollten, um golf du würdest auf den Code-Golf-SE.InformationsquelleAutor der Antwort Chris Lutz
Wählen Sie eine Plattform, obwohl eingebettet ist wahrscheinlich einfacher.
malloc
(odernew
) eine Tonne RAM (oder Leck-RAM über die Zeit oder sogar fragment Sie mithilfe naive algorithmen). Boom.malloc
zurückNULL
für mich bei Gelegenheit, wenn "schlechte" Dinge passiert sind.In der Antwort auf Ihre Bearbeitung. Ja wieder. Fragmentierung des Speichers im Laufe der Zeit kann es so machen, dass auch eine einzelne Zuweisung eines
int
scheitern kann. Beachten Sie auch, dassmalloc
nicht nur reservieren, die 4 Byte für eineint
, aber greifen kann, so viel Raum, wie es will. Es hat seine eigene Buchführung Sachen und sehr oft greifen 32-64 bytes minimum.InformationsquelleAutor der Antwort Michael Dorgan
Auf ein mehr-oder-weniger standard-system, mit einem standard-ein-parameter-malloc, gibt es drei mögliche Versagensarten (die ich mir denken kann):
1) Die Größe der Zuteilung beantragt, ist nicht zulässig. ZB, einige Systeme können nicht zulassen, dass eine Zuweisung > 16M, auch wenn mehr Speicherplatz verfügbar ist.
2) Eine zusammenhängende Fläche von der Größe gewünscht, mit Standard-Grenze, nicht direkt in den heap. Es kann noch viel Haufen, aber einfach nicht genug in einem Stück.
3) Die gesamten, allokierten heap überschritten hat einige "künstliche" Grenze. ZB kann der Benutzer untersagt, die Zuteilung von mehr als 100M, auch wenn es 200M und unentgeltlich zur Verfügung gestellt, um das "system" in einem einzigen kombinierten heap.
(Natürlich, Sie können Kombinationen von 2 und 3, da einige Systeme zuordnen, nicht-zusammenhängenden Blöcken des Adressraums dem heap, wie es wächst, indem die "heap size limit" auf die Gesamtzahl der Blöcke.)
Beachten Sie, dass einige Umgebungen unterstützen zusätzliche malloc Parameter wie die Ausrichtung und die pool-ID, die können fügen Sie Ihre eigenen Wendungen.
InformationsquelleAutor der Antwort Hot Licks
Ja. Malloc NULL zurück, wenn der kernel/system lib sicher sind, dass kein Speicher zugeordnet werden kann.
Der Grund, warum Sie in der Regel nicht sehen, diese auf modernen Maschinen ist, dass Malloc nicht wirklich Speicher, sondern es Anfragen einige "virtuellen Adressraum" reserviert, für Ihr Programm, so dass Sie schreiben können. Kerne, wie Sie moderne Linux eigentlich gegenüber verpflichten, ist, dass Sie lassen Sie die Zuweisung von mehr Speicher, als Ihr system, können tatsächlich (swap + RAM) so lange, wie es passt alles in den Adressraum des Systems (in der Regel 48bits auf 64bit-Plattformen, IIRC). So auf diese Systeme Sie werden wahrscheinlich trigger eine OOM-killer, bevor Sie auslösen werden, eine Rückgabe eines NULL-pointer. Ein gutes Beispiel ist ein 512 MB RAM in einem 32bit-Maschine: es ist trivial zu schreiben Sie ein C-Programm, dass wird gegessen werden durch den OOM-killer, weil der versucht es zu malloc alle verfügbaren RAM + swap.
(Overcomitting kann deaktiviert werden zur compile-Zeit auf Linux, so kommt es auf den build-Optionen, ob oder nicht eine bestimmte Linux-kernel overcommit. Allerdings Bestand desktop-distro-Kernel, die es tun.)
InformationsquelleAutor der Antwort user268396