C – calloc () v. Malloc ()

Dupliquer possible:
c différence entre malloc et calloc

S’il vous plaît 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 parasites, alors que la mémoire allouée par la fonction calloc () contient tous les zéros.

Source ( Programmation ‘C’ , Salim Y. Amdani)

Merci

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

malloc() est plus rapide, car calloc() initialise la mémoire allouée pour contenir tous les zéros. Étant donné que vous voudriez généralement utiliser et initialiser la mémoire vous-même, cet avantage supplémentaire de calloc() peut ne pas être nécessaire.

calloc initialise la mémoire avant de l’utiliser, mais pas calloc .

Reportez-vous à ce lien:

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 devez appeler quelque chose comme memset pour réinitialiser la mémoire, par exemple

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

calloc vous enregistre cette étape supplémentaire. L’importance de l’initialisation de la mémoire est que vous amenez une variable à un état connu plutôt qu’à un état inconnu. Ainsi, si vous recherchez une valeur attendue dans une variable, par exemple un élément de tableau, pré-initialisée à l’avance, vous pouvez être sûr que la valeur que vous vérifiez n’est pas déréglée. En d’autres termes, vous pouvez faire la distinction entre des valeurs erronées et légitimes.

Par exemple, si vous laissez simplement des déchets dans la variable et que vous recherchez une valeur, par exemple 42, vous n’avez aucun moyen de savoir si la valeur a vraiment été définie sur 42 par votre programme, ou s’il ne s’agit que de rests de déchets, ne pas l’initialiser.

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

 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 définies lors du démarrage de l’ordinateur ou voir une partie de la mémoire qui appartenait à des programmes en cours d’exécution mais n’était pas effacée après l’allocation et la fermeture du programme.

calloc lui-même est plus lent que malloc car vous devez passer du temps à vider le contenu de la mémoire allouée. Donc, si vous avez juste besoin d’allouer de la mémoire puis de copier des choses là-bas, vous êtes libre d’utiliser malloc .

Cela signifie simplement que si vous allouez de la mémoire, avec calloc (), tout ce que vous allouez est 0. Autrement dit, si vous allouez de l’espace pour un tableau d’entiers, ils seront tous mis à 0, alors qu’avec malloc (), la mémoire pas initialisé de quelque façon que ce soit.

Vous pouvez utiliser calloc dans des situations où vous allez simplement faire un memset de 0 dans la mémoire de toute façon.