Différence entre calloc et malloc en C

Il existe deux différences majeures entre malloc et calloc en programmation C: premièrement en nombre d’arguments. malloc() prend un seul argument, alors que calloc() prend deux arguments. Deuxièmement, malloc() n’initialise pas la mémoire allouée, alors que calloc() initialise la mémoire allouée à ZERO.
 
 
Malloc et Calloc sont utilisés en C pour l’allocation dynamique de mémoire. Ils permettent d’obtenir des blocs de mémoire de manière dynamique. L’allocation dynamique de mémoire est une caractéristique unique du langage C qui nous permet de créer des types de données et des structures de toutes tailles et de toutes longueurs adaptées à nos programmes. Vous trouverez ci-dessous les principales différences entre malloc et calloc, ainsi que leur syntaxe et leur exemple d’utilisation.
Différence entre & et &&Différence entre & et && en C/C++Quelle est la différence entre & et && ? – les deux sont des opérateurs utilisés pour évaluer les instructions conditionnelles. L’opérateur & est un…Lire plus

Table de comparaison
malloc calloc
Le nom malloc signifie allocation de mémoire. Le nom calloc est synonyme d’allocation contiguë.
void * malloc (size_t n) renvoie un pointeur sur n octets de mémoire non initialisée, ou NULL si la demande ne peut être satisfaite. Si l’espace affecté par malloc() est saturé, les résultats ne sont pas définis. void * calloc (size_t n, size_t size) renvoie un pointeur sur un espace libre suffisant pour un tableau de n objets de la taille spécifiée, ou NULL si la demande ne peut être satisfaite. Le stockage est initialisé à zéro.
malloc() prend un argument, à savoir le nombre d’octets. calloc() prend deux arguments: le nombre de blocs et la taille de chaque bloc.
syntaxe de malloc ():

void * malloc (size_t n);

Alloue n octets de mémoire. Si l’allocation réussit, un pointeur vide sur la mémoire allouée est renvoyé. Sinon, NULL est renvoyé.

syntaxe de calloc ():

void * calloc (size_t n, size_t size);

Alloue un bloc de mémoire contigu suffisamment grand pour contenir n éléments. La zone allouée est initialisée à zéro.

malloc est plus rapide que calloc. calloc prend un peu de temps que malloc en raison de l’initialisation du mémoire allouée par zéro. Cependant, dans la pratique, la différence de vitesse est très minime.

 
 

Exemple de Malloc
/* Allocation de mémoire pour un entier. */
int *ptr = (int*) malloc(sizeof (int)); 
if (ptr == NULL) 
{
   printf("Impossible d'allouer la mémoire\n");
   exit(-1);
}
else
   printf("Mémoire allouée avec succès.\n");

 

Exemple de Calloc
/* Allocation de mémoire pour un tableau de 10 éléments de type int. */
int *ptr = (int*) calloc(20 ,sizeof (int));
if (ptr == NULL) 
{
   printf("Impossible d'allouer de la mémoire\n");
   exit(-1);
} 
else
   printf("Mémoire allouée avec succè.\n");
QCM-CQCM en programmation C – Les noms de variables – Partie 1QCM sur C avec des réponses pour la préparation des entretiens, des tests en ligne, des examens etc.     1. La norme C99 garantit…Lire plus
Conclusion

Les fonctions malloc et calloc sont utilisées pour l’allocation de mémoire et ont des avantages et inconvénients. Un inconvénient tel que malloc est rapide par rapport à calloc. De plus, malloc est plus facile à utiliser car il ne prend qu’un argument, car calloc alloue de la mémoire et initialise la zone mémoire avec ZERO. Mais vous préféreriez utiliser calloc lorsque l’initialisation des variables est plus importante pour vous.
 
 

Une réflexion sur “Différence entre calloc et malloc en C

  • mai 26, 2020 à 10:03
    Permalien

    Bonjour,

    Je suis a peu près certain que calloc n’initialise pas la mémoire à zero c’est l’OS qu’il le fait au préalable avec le zero-page thread… calloc va juste prendre ces pages de mémoire déjà misent à zéro par le zero-page thread. C’est le fonctionnement sous windows en tout cas. Vous pouvez vérifier ( en mode release évidement) et constater.
    Si cet article parle uniquement de linux que je ne connais pas merci de le préciser pour éviter d’induire en erreur.

    Merci de rectifier.

    Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *