C – calloc() gegen malloc() [duplicate]

Lesezeit: 5 Minuten

Benutzer-Avatar
Kevin Meredith

Mögliches Duplikat:

c Unterschied zwischen malloc und calloc

Bitte erläutern Sie die Bedeutung dieser Aussage,

Ein weiterer Unterschied zwischen den Funktionen malloc() und calloc() besteht darin, dass der von der Funktion malloc( ) zugewiesene Speicher unbrauchbare Werte enthält, während der von der Funktion calloc( ) zugewiesene Speicher ausschließlich Nullen enthält.

Quelle (‘C’-ProgrammierungSalim Y. Amdani)

Vielen Dank

  • Es scheint ziemlich selbsterklärend. Was ist die Frage?

    – Stern-Taste

    10. August 2010 um 12:48 Uhr

  • Verstehst du nicht, was Garbage Values ​​sind?

    – Albino-Schwertfisch

    10. August 2010 um 12:48 Uhr


  • Warum wird malloc() nicht initialisiert? Es scheint mir, dass calloc() über malloc() verwendet werden sollte, vorausgesetzt, dass das Initialisieren des Speichers eine gute Praxis ist.

    – Kevin Meredith

    10. August 2010 um 12:51 Uhr

  • Was wäre, wenn Sie diesen Speicher für etwas anderes als nur Nullen verwenden wollten? Dann haben Sie die Zeit verschwendet, die es gedauert hat, alles auf 0 zu setzen.

    – Paul Tomblin

    10. August 2010 um 12:54 Uhr

  • Es gibt keinen Grund, den Speicher auf Null zu setzen, wenn Sie den Speicher direkt danach initialisieren. zB Kopieren eines Strings in den mallocierten Speicher, Initialisieren einer Struktur mit verschiedenen Werten, etc.

    – Nr

    10. August 2010 um 13:00 Uhr

Benutzer-Avatar
Eduard Leno

Aus http://wiki.answers.com/Q/Is_it_better_to_use_malloc_or_calloc_to_allocate_memory

malloc() ist schneller, da calloc() initialisiert den zugewiesenen Speicher so, dass er nur Nullen enthält. Da Sie den Speicher normalerweise selbst verwenden und initialisieren möchten, ist dieser zusätzliche Vorteil von calloc() möglicherweise nicht erforderlich.

  • Laut diesem kürzlich erschienenen Artikel ist dies nicht wahr. Er zeigt, dass calloc meistens schneller ist und auch einige andere Vorteile hat. vorpus.org/blog/why-does-calloc-exist

    – eric.frederich

    6. Dezember 2016 um 15:12 Uhr

  • Ich stimme zu, calloc ist auf einem modernen System normalerweise nicht nur schneller, es ist manchmal viel schneller und es kann einige peinliche Fehler vermeiden! Für eingebettete Sachen, YMMV.

    – John Lawrence Aspden

    17. September 2018 um 16:39 Uhr


Benutzer-Avatar
DCP

calloc initialisiert den Speicher, bevor Sie ihn verwenden, aber malloc nicht.

Beziehen auf Dies Verknüpfung:

Die calloc()-Funktion soll ungenutzten Platz für ein Array von Nelem-Elementen zuweisen, deren Größe in Bytes jeweils elsize ist. Der Raum soll auf alle Bits 0 initialisiert werden.

Mit mallocwenn Sie den gleichen Effekt garantieren möchten, müssen Sie so etwas wie memset aufrufen, um den Speicher zurückzusetzen, z

char* buffer = (char*)malloc(100);
memset(buffer,0,100);

calloc spart Ihnen diesen zusätzlichen Schritt. Die Bedeutung der Initialisierung des Speichers besteht darin, dass Sie eine Variable in einen bekannten Zustand und nicht in einen unbekannten Zustand bringen. Wenn Sie also eine Variable, sagen wir ein Array-Element, auf einen erwarteten Wert prüfen, dann können Sie sicher sein, dass der Wert, den Sie prüfen, kein Müll ist, indem Sie die Variable im Voraus initialisiert haben. Mit anderen Worten, Sie können zwischen Müll und legitimen Werten unterscheiden.

Wenn Sie zum Beispiel nur Müll in der Variablen lassen und nach einem Wert suchen, sagen wir 42, dann haben Sie keine Möglichkeit zu wissen, ob der Wert wirklich von Ihrem Programm auf 42 gesetzt wurde, oder ob das nur etwas Müll ist, der wegen Ihnen übrig geblieben ist habe es nicht initialisiert.

  • Vielen Dank. Welche Bedeutung hat die Initialisierung des Speichers? Warum wird malloc() nicht initialisiert?

    – Kevin Meredith

    10. August 2010 um 12:50 Uhr

  • Meistens werden Sie, sobald Sie Speicher zuweisen, dessen Inhalt selbst füllen (z. B. indem Sie allen Elementen in einem Array oder allen Feldern in einer Struktur Werte zuweisen). In diesem Fall muss der Speicher nicht auf Null gesetzt werden, bevor Sie ihn verwenden, also verwenden Sie malloc. Wenn Sie den Speicher unbedingt auf Null setzen müssen, können Sie calloc verwenden. Dies ist äquivalent zu malloc gefolgt von memset, könnte aber schneller sein, weil der Zuordner clever damit umgehen kann.

    – Tom Anderson

    10. August 2010 um 12:55 Uhr

  • Das Beispiel ist falsch, sizeof(buffer) ist gleich sizeof(char *); es wird nicht den gesamten Puffer auf Null initialisieren.

    – Prätorianer

    10. August 2010 um 12:56 Uhr

  • Stellen Sie sich vor, Sie hätten ein Grundstück zugeteilt bekommen. Sie wissen nicht, wo das Land ist, Sie wissen nicht, was auf dem Land ist, alles, was Sie bekommen, ist ein Urkundentitel. Das ist was malloc effektiv – gibt einen Zeiger auf einen Speicherbereich zurück. Jetzt calloc könnte ähnlich sein malloc außer dass der Rat garantiert, zuerst alles vom Land zu räumen. Dauert viel mehr Zeit und ist daher teurer, aber Sie wissen, was Sie bekommen. Du wählst.

    – PP.

    10. August 2010 um 13:01 Uhr

Benutzer-Avatar
plaes

calloc(...) ist grundsätzlich malloc + memset(wenn Sie den Speicher 0 initialisieren möchten)

ptr = malloc(sizeof(struct fubar));
memset(ptr, 0, sizeof (struct fubar)); //here we could use some different value instead of 0 whereas calloc always 0 initialises.

Wenn Sie verwenden malloc Um etwas Speicher zuzuweisen, wird sein vorheriger Inhalt nicht gelöscht (dh nicht initialisiert). Möglicherweise erhalten Sie zufällige Werte, die beim Hochfahren des Computers festgelegt wurden, oder Sie sehen möglicherweise einen Teil des Speichers, der zu zuvor ausgeführten Programmen gehörte, aber nach der Zuweisung und dem Beenden des Programms nicht freigegeben wurde.

calloc selbst ist langsamer als malloc da Sie einige Zeit aufwenden müssen, um den Inhalt des zugewiesenen Speichers zu löschen. Wenn Sie also nur etwas Speicher zuweisen und dann etwas dorthin kopieren müssen, können Sie es frei verwenden malloc.

  • Wirke nicht malloc

    – Katze

    24. September 2016 um 19:50 Uhr

  • @cat, danke behoben 😉

    – bitte

    26. September 2016 um 8:19 Uhr

Es bedeutet nur, dass, wenn Sie mit calloc() Speicher zuweisen, alles, was Sie zuweisen, 0 ist. Wenn Sie also Platz für ein Array von Ganzzahlen zugewiesen haben, werden alle auf 0 gesetzt, während mit malloc() der Speicher nicht vorhanden ist in keiner Weise initialisiert.

Sie könnten calloc in Situationen verwenden, in denen Sie sowieso nur ein Memset von 0 für den Speicher ausführen.

1383700cookie-checkC – calloc() gegen malloc() [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy