Wofür steht das erste „c“ in „calloc“?

Lesezeit: 6 Minuten

Benutzeravatar von Raymond Hettinger
Raymond Hettinger

Ein Student stellte die Frage und ich wusste es nicht genau.

Zu den Vermutungen gehören: “gezählt”, “clearing”, “chunked”, “complete”, …

Die Standardbibliotheksdokumentation sagt nicht, wofür es steht, und es gibt keine ähnlich benannten Funktionen, die auf ein Muster hinweisen würden. Kennt jemand die eigentliche Etymologie und hat vielleicht eine maßgebliche Referenz, um sie zu untermauern?

  • Genommen von man 3 calloc: void *calloc(size_t nmemb, size_t size); – Das calloc() Funktion weist Speicher für ein Array von zu nmemb Elemente der Größe Bytes und gibt einen Zeiger auf den zugewiesenen Speicher zurück. Der Speicher wird auf Null gesetzt. Wenn nmemb oder Größe ist dann 0 calloc() gibt entweder NULL oder einen eindeutigen Zeigerwert zurück, an den später erfolgreich übergeben werden kann free().

    – gengisdave

    8. August 2015 um 9:35 Uhr


Benutzeravatar von Theodoros Chatzigiannakis
Theodoros Chatzigiannakis

Laut einem Auszug aus dem Buch Linux-Systemprogrammierung (von Robert Love) gibt es keine offiziellen Quellen zur Etymologie von calloc.


Einige plausible Kandidaten scheinen zu sein:

  1. Zählen oder gezähltWeil calloc nimmt ein separates count-Argument.
  2. Klarda es sicherstellt, dass der zurückgegebene Speicherblock gelöscht wurde.

    • Brian Kernighan soll glauben, dass das „c“ für steht klar (obwohl er zugegeben hat, dass er sich nicht sicher ist).
    • (Zeige Kommentare.) Ein früher calloc.c scheint einen expliziten Bezug auf das Wort zu enthalten klar in einem Sourcecode-Kommentar (aber kein Verweis auf das Wort zählen oder an einen anderen Kandidaten). In einem anderen Quellcodekommentar in der Datei malloc.cdas Wort klar erscheint wieder, in Bezug auf das Wort calloc.
  3. Cwie in der C-Sprache.

    • (Siehe alks Antwort und Kommentare.) Möglicherweise eine Namenskonvention für eine Reihe von Funktionen, die ungefähr zur gleichen Zeit eingeführt wurden.

  • Die V7 (die Version, die hinzugefügt malloc() und calloc() nach Unix) Quellcode verwendet clear in einem Kommentar und löscht tatsächlich den zugewiesenen Speicherblock.

    – cremnr

    8. August 2015 um 0:43 Uhr


  • @cremno Wow, das ist ein äußerst nützliches Referenz-Repository. Und es bringt uns wahrscheinlich so nah an eine Antwort, wie wir bekommen können. Ich habe die Antwort so bearbeitet, dass sie Ihren Link enthält.

    – Theodoros Chatzigiannakis

    8. August 2015 um 0:55 Uhr

  • Und wozu dient dann der c in cfree() Stand? :-S

    – alk

    8. August 2015 um 7:39 Uhr


  • @Alk: Ach! Es ist interessant, dass es den Speicher nicht löscht (zumindest explizit). Interessanterweise ist es nicht die einzige Funktion, die mit beginnt c. Vielleicht c steht einfach für C (die Programmiersprache) als open oder alloc wurden bereits verwendet. Siehe Lesks Die portable C-Bibliothek (unter UNIX) das scheint ein Dokument darüber zu sein iolib (entspricht aber nicht 100% dem V6).

    – cremnr

    9. August 2015 um 17:09 Uhr


  • @cremno Wenn Sie der Meinung sind, dass Sie genügend Hinweise für das “c” gefunden haben, das sich auf die C-Sprache selbst bezieht, darf ich vorschlagen, dass Sie eine Antwort geben? (Für mich klingt das derzeit nach der überzeugendsten Etymologie.)

    – Theodoros Chatzigiannakis

    9. August 2015 um 23:16 Uhr


Benutzeravatar von alk
alk

Ich habe mal recherchiert und folgendes gefunden in “UNIX@ TIME-SHARING SYSTEM: UNIX PROGRAMMER’S MANUAL. Seventh Edition, Volume 2”, Kapitel “PROGRAMMING” (Kursiv von mir):

char *malloc(num);

ordnet zu num Byte. Der zurückgegebene Zeiger ist ausreichend gut ausgerichtet, um für jeden Zweck verwendet werden zu können. NULL wird zurückgegeben, wenn kein Platz verfügbar ist.

char *calloc(num, size);

reserviert Platz für num Artikel jeweils size Größe. Das Leerzeichen ist garantiert auf 0 gesetzt und der Zeiger ist ausreichend gut ausgerichtet, um für jeden Zweck verwendet werden zu können. NULL wird zurückgegeben, wenn kein Platz verfügbar ist.

 cfree(ptr) char *ptr;

Speicherplatz wird an den Pool zurückgegeben, der von verwendet wird calloc. Unordnung kann erwartet werden, wenn der Zeiger nicht erhalten wurde calloc.

  • Der letzte Satz ist ein klarer Beweis dafür calloc() war definitiv (sollte?) unterschiedlicher aus malloc() dann einfach durch Löschen des Speichers.

    Interessanterweise gibt es keinen Hinweis darauf free() auf irgendeiner dieser paar hundert Seiten … 🙂

  • Hatte außerdem schon UNIX V6 calloc() was ruft alloc(). Die (verknüpfte) Quelle zeigt keinen Ansatz, um Speicher auf Null zu setzen.

Abschließend aus den beiden obigen Fakten widerspreche ich entschieden der Theorie, dass das führende “c” in calloc() steht für “klar”.

  • Vielleicht stand es ursprünglich für etwas anderes, aber es wurde definitiv umfunktioniert (wie der Rest von iolib, der zu libstdio von V7 wurde). Ich schätze, es wird schwierig sein, eine endgültige Antwort zu bekommen (jedoch scheint Mr. Lesk noch am Leben zu sein). Leider gibt es bereits eine akzeptierte Antwort. Übrigens. Was ist mit “Zählen”?

    – cremnr

    9. August 2015 um 17:26 Uhr

  • @cremno: Ich werde nicht in einer Antwort spekulieren. Im Moment würde ich aber eher auf “verschmelzen” oder “kompakt“.

    – alk

    9. August 2015 um 17:30 Uhr


  • Ich folge Ihrer Schlussfolgerung über den letzten Satz der Dokumentation nicht als “eindeutigen Beweis” für irgendetwas, außer der Tatsache, dass er eine Implementierung von erlaubt calloc etwas anders machen als malloc und auf Null setzen (zum Beispiel Speicher von einer vorab auf Null gesetzten Quelle geben).

    – Theodoros Chatzigiannakis

    9. August 2015 um 17:49 Uhr


  • @TheodorosChatzigiannakis: Hast du die Quellen studiert für calloc()‘s V6-Implementierung, die ich verlinkt habe? free() gibt Chunks an den Pool zurück, ohne sie zu löschen. calloc() holt aus dem Pool, ohne etwas zu löschen.

    – alk

    9. August 2015 um 17:51 Uhr

  • Sie müssen Ihre Antwort nicht bearbeiten. Ich wollte nur Ihre Meinung lesen, aber was ist mit c, was C bedeutet, da es ursprünglich Teil der portablen C-Bibliothek war (siehe Dies PDF, das ich zuvor verlinkt habe)? Es unterstützt auch Ihr erstes Argument.

    – cremnr

    9. August 2015 um 18:05 Uhr


Ich glaube, niemand weiß es. Es ist jedoch nützlich, den calloc()-Aufruf mit der Semantik zu beschreiben, dass der Speicher gelöscht werden muss, im Gegensatz zu malloc (memory allocate), das zufälligen Müll zurückgibt, der von einer vorherigen free()-Operation übrig geblieben ist Modus Operandi für Studenten, was insofern nützlich ist, als es den Benutzer daran erinnert, dass malloc() einen unsicheren Wert zurückgibt.

Benutzeravatar von Anant Barthwal
Anant Bartwal

calloc = zusammenhängende Speicherzuordnung.

Es bedeutet nach der Syntax von calloc() dh

void *calloc (size_t number_of_blocks, size_t size_of_each_block_in_bytes);   

es erhält zwei Parameter: nein. von Blöcken und der Größe eines Blocks, also weist es ein Array von Speicher für die Nr. zu. von Blöcken, die Sie bereitstellen.

Wie Anants Antwort sagt, steht es für Kontinuierliche Zuordnung. Pro

Anstatt aus einem einkompilierten Array mit fester Größe zuzuordnen, fordert malloe nach Bedarf Speicherplatz vom Betriebssystem an. Da auch andere Aktivitäten im Programm Speicherplatz anfordern können, ohne diesen Zuordner aufzurufen, darf der von malloe verwaltete Speicherplatz nicht zusammenhängend sein. Somit wird sein freier Speicherplatz als Liste freier Blöcke geführt. Jeder Block enthält eine Größe, einen Zeiger auf den nächsten Block und den Raum selbst. Die Blöcke werden in der Reihenfolge aufsteigender Speicheradresse gehalten, und der letzte Block (höchste Adresse) zeigt auf den ersten.

Abschnitt 8.7 des Die Programmiersprache CK&R, 2. Aufl.

  • Der Heap selbst ist nicht zusammenhängend, aber Blöcke von zugewiesenem Speicher sind separat stets zusammenhängend, zumindest logisch

    – Kaiyakha

    9. Dezember 2020 um 22:53 Uhr


  • Der Heap selbst ist nicht zusammenhängend, aber Blöcke von zugewiesenem Speicher sind separat stets zusammenhängend, zumindest logisch

    – Kaiyakha

    9. Dezember 2020 um 22:53 Uhr


1410770cookie-checkWofür steht das erste „c“ in „calloc“?

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

Privacy policy