web-dev-qa-db-fra.com

Que signifie le premier "c" dans "calloc"?

Un étudiant a posé la question et je n'en étais pas sûr.

Les suppositions incluent: "compté", "effacement", "fragmenté", "complet", ...

La documentation standard de la bibliothèque ne dit pas ce qu'elle représente et il n'y a pas de fonctions de même nom qui indiqueraient un modèle. Quelqu'un connaît-il l'étymologie réelle et peut-être a-t-il une référence faisant autorité pour la sauvegarder?

44
Raymond Hettinger

Selon un extrait du livre Linux System Programming (par Robert Love), aucune source officielle n'existe sur l'étymologie de calloc.


Certains candidats plausibles semblent être:

  1. Count or counted , parce que calloc prend une valeur distincte argument de comptage.
  2. Clear , car il garantit que le morceau de mémoire retourné a été effacé.

    • Brian Kernighan est censé croire que le "c" signifie clair (bien qu'il ait admis qu'il n'était pas sûr).
    • (Voir commentaires.) Un début calloc.c semble contenir une référence explicite au Word clear dans un commentaire de code source (mais aucune référence au Word compter ou à tout autre candidat). Dans un autre commentaire de code source dans le fichier malloc.c , le mot clair réapparaît, en référence au mot calloc.
  3. [~ # ~] c [~ # ~] , comme dans le langage C.

    • (Voir réponse de alk et commentaires.) Peut-être une convention de dénomination pour un ensemble de fonctions introduites à peu près en même temps .

J'ai fait quelques recherches et j'ai trouvé ce qui suit dans "UNIX @ TIME-SHARING SYSTEM: UNIX PROGRAMMER'S MANUAL. Seventh Edition, Volume 2", chapitre "PROGRAMMING" ( Italics par moi ):

char *malloc(num);

alloue num octets. Le pointeur renvoyé est suffisamment bien aligné pour être utilisable à toutes fins. NULL est retourné si aucun espace n'est disponible.

char *calloc(num, size);

alloue de l'espace pour num éléments chacun de size taille. L'espace est garanti réglé à 0 et le pointeur est suffisamment bien aligné pour être utilisable à toutes fins. NULL est retourné si aucun espace n'est disponible.

 cfree(ptr) char *ptr;

L'espace est retourné au pool utilisé par calloc. Un désordre peut être attendu si le pointeur n'a pas été obtenu à partir de calloc.

  • La dernière phrase est une preuve claire que calloc() était définitivement (censé être?) plus différent de malloc() puis simplement en effaçant la mémoire.

    Assez intéressant, il n'y a aucune référence à free() sur aucune de ces centaines de pages ... :-)

  • De plus, UNIX V6 avait déjà calloc() qui appelle alloc() . La source (liée) ne montre aucune approche pour mettre à zéro toute mémoire.

Pour conclure des deux faits ci-dessus, je m'oppose fortement à la théorie selon laquelle le premier "c" dans calloc() signifie "clair".

8
alk

Je pense que personne ne le sait. Mais décrire l'appel calloc () avec la sémantique selon laquelle la mémoire doit être effacée, par opposition à malloc (allocation de mémoire) qui retourne tous les déchets aléatoires qui ont été laissés par une précédente opération free (), est utile modus operandi pour les étudiants, ce qui est utile car il rappelle à l'utilisateur que malloc () renvoie une valeur non sécurisée.

3
jrrk

calloc = allocation de mémoire contiguë.

Cela signifie selon la syntaxe de calloc() i.e

void *calloc (size_t number_of_blocks, size_t size_of_each_block_in_bytes);   

il reçoit deux paramètres: non. de blocs et la taille d'un bloc, il alloue donc un tableau de mémoire pour le no. de blocs que vous fournirez.

1
Anant Barthwal