web-dev-qa-db-fra.com

C - calloc () contre malloc ()

Duplicata possible:
différence c entre malloc et calloc

Veuillez expliquer la signification de cette déclaration,

Une autre différence entre les fonctions malloc () et calloc () est que la mémoire allouée par la fonction malloc () contient des valeurs inutiles, tandis que la mémoire allouée par la fonction calloc () contient tous les zéros.

Source ( Programmation 'C', Salim Y. Amdani)

Merci

32
Kevin Meredith

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

malloc() est plus rapide, puisque calloc() initialise la mémoire allouée pour contenir tous les zéros. Dans la mesure où vous souhaitez généralement utiliser et initialiser la mémoire vous-même, cet avantage supplémentaire de calloc() peut ne pas être nécessaire.

39
Edward Leno

calloc initialise la mémoire avant de l'utiliser, mais malloc ne le fait pas.

Reportez-vous au lien this :

La fonction calloc () doit allouer de l'espace inutilisé à un tableau d'éléments nelem dont la taille en octets est elsize. L'espace doit être initialisé à tous les bits 0.

Avec malloc, si vous voulez garantir le même effet, vous devrez appeler quelque chose comme memset pour réinitialiser la mémoire, par ex.

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

calloc vous évite cette étape supplémentaire. L'importance de l'initialisation de la mémoire est que vous obtenez une variable dans un état connu plutôt que dans un état inconnu. Donc, si vous vérifiez une variable, disons un élément de tableau, pour une valeur attendue, puis en ayant pré-initialisé la variable à l'avance, vous pouvez être sûr que la valeur que vous vérifiez n'est pas une ordure. En d'autres termes, vous pouvez faire la distinction entre les ordures et les valeurs légitimes.

Par exemple, si vous laissez simplement des ordures dans la variable et que vous recherchez une valeur, disons 42, alors vous n'avez aucun moyen de savoir si la valeur a vraiment été définie sur 42 par votre programme, ou si ce sont juste des restes d'ordures parce que vous ne l'a pas initialisé.

24
dcp

calloc(...) est essentiellement malloc + memset (si vous voulez initialiser la mémoire à 0)

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.

Lorsque vous utilisez malloc pour allouer de la mémoire, son contenu précédent n'est pas effacé (c'est-à-dire non initialisé). Vous pouvez obtenir des valeurs aléatoires qui ont été définies lors du démarrage de la machine ou vous pouvez voir une partie de la mémoire qui appartenait aux programmes en cours d'exécution mais qui n'a pas été effacée après l'allocation et la sortie du programme.

calloc lui-même est plus lent que malloc car il faut passer un peu de temps pour effacer le contenu de la mémoire allouée. Donc, si vous avez juste besoin d'allouer de la mémoire puis de copier des trucs là-bas, vous êtes libre d'utiliser malloc.

8
plaes

Cela signifie simplement que si vous allouez de la mémoire, avec calloc (), tout ce que vous allouez est 0. c'est-à-dire si vous avez alloué de l'espace pour un tableau d'entiers, ils seraient tous mis à 0, tandis qu'avec malloc (), la mémoire n'est pas 't initialisé en aucune façon.

Vous pouvez utiliser calloc dans les situations où vous allez tout de même faire un ensemble de 0 à la mémoire.

3
Shawn D.