Wann sollte ich calloc statt malloc verwenden?

Lesezeit: 2 Minuten

Dies ist aus Beejs Leitfaden zu C
„Der Nachteil bei der Verwendung von calloc() ist, dass das Löschen des Speichers einige Zeit in Anspruch nimmt, und in den meisten Fällen müssen Sie es nicht löschen, da Sie es sowieso nur überschreiben. Aber wenn Sie jemals malloc() verwenden einen Block und dann direkt danach den Speicher auf Null setzen, können Sie calloc() verwenden, um dies in einem Aufruf zu tun.”

Was ist also ein mögliches Szenario, wenn ich den Speicher auf Null löschen möchte?

Benutzeravatar von Fred Foo
Fred Fu

Wenn die Funktion, an die Sie einen Puffer übergeben, in ihrer Dokumentation angibt, dass ein Puffer mit Nullen gefüllt sein muss. Sie können den Speicher zur Sicherheit auch jederzeit auf Null setzen; Es dauert eigentlich nicht so lange, es sei denn, die Puffer sind wirklich riesig. Die Speicherzuweisung selbst ist der potenziell teure Teil der Operation.

Ein Szenario besteht darin, dass Sie ein Array von Ganzzahlen zuweisen (z. B. als Akkumulatoren oder Zählervariablen) und jedes Element im Array bei 0 beginnen soll.

In einigen Fällen, in denen Sie Speicher für eine Struktur zuweisen, werden einige Mitglieder dieser Struktur möglicherweise ausgewertet irgendein Ausdruck oder hinein bedingte Aussage ohne diese Struktur zu initialisieren, wäre es in diesem Fall schädlich oder würde Ihnen ein undefiniertes Verhalten geben. Überwinden Sie diese Form also besser

1> malloc that structure and memset it with 0 before using that structure 

oder

2> calloc that structure  

Hinweis: Einige fortgeschrittene Speicherverwaltungsprogramme mit malloc setzen den Speicher auch mit 0 zurück

Es gibt viele Zeiten, in denen Sie den Speicher auf Null setzen möchten!

Einige Beispiele:

  • Speicher zuweisen, um eine Struktur zu enthalten, in der alle Mitglieder auf Null initialisiert werden sollen
  • Zuweisen von Speicher für ein Array von Zeichen, in das Sie später eine Anzahl von Zeichen schreiben und dann als NULL-terminierten String behandeln
  • Zuweisen von Speicher für ein Array von Zeigern, die Sie auf NULL initialisieren möchten

Wenn der gesamte zugewiesene Speicher mit Nullen gefüllt ist, ist das Verhalten des Programms viel besser reproduzierbar (also ist das Verhalten wahrscheinlich dasselbe, wenn Sie Ihr Programm erneut ausführen). Aus diesem Grund verwende ich keine nicht initialisierten Malloc-Zonen.

(Aus ähnlichen Gründen mache ich das normalerweise beim Debuggen eines C- oder C++-Programms unter Linux echo 0 > /proc/sys/kernel/randomize_va_space so dass mmap Verhalten ist besser reproduzierbar).

Und wenn Ihr Programm keine großen Blöcke (dh Dutzende von Megabytes) zuweist, ist die Zeit, die innerhalb von malloc verbracht wird, viel größer als die Zeit, um es zu nullen.

1443730cookie-checkWann sollte ich calloc statt malloc verwenden?

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

Privacy policy