Avant de comprendre les fonctions malloc () et calloc (), laissez-nous d'abord comprendre le sens de l'allocation dynamique de mémoire. L'allocation de mémoire est la procédure d'attribution de la mémoire de l'ordinateur pour l'exécution de programmes et de processus. Nous utilisons des techniques d’allocation dynamique lorsque nous ne savons pas au préalable combien d’espace mémoire est nécessaire pour le programme et le processus.
L'allocation dynamique de mémoire résulte des problèmes liés à l'allocation statique de la mémoire, par exemple si moins d'éléments sont stockés, le reste de la mémoire est inutilement gaspillé. Par conséquent, il résout les problèmes d'allocation de mémoire statique où la mémoire n'est allouée que lorsque cela est nécessaire.
Tableau de comparaison
Base de comparaison | malloc () | calloc () |
---|---|---|
Nombre de blocs | Attribue un seul bloc de mémoire demandée. | Assigne plusieurs blocs de la mémoire demandée. |
Syntaxe | void * malloc (size_t size); | void * calloc (size_t num, size_t size); |
Initialisation | malloc () n'efface pas et n'initialise pas la mémoire allouée. | La mémoire allouée est initialisée à zéro à l'aide de calloc (). |
Manière d'allocation | La fonction malloc () alloue une mémoire de taille 'taille' à partir du tas. | La fonction calloc () alloue de la mémoire dont la taille est égale à num * size. |
La vitesse | Vite | Comparativement lente. |
Définition de malloc ()
La fonction malloc affecte un bloc de mémoire en octets . L'utilisateur doit explicitement indiquer la taille du bloc, ce qui est nécessaire à l'utilisation.
Par le biais de la fonction malloc, le programme demande à la RAM du système d’attribuer la mémoire. Si la demande est acceptée (c’est-à-dire que la fonction malloc indique que l’allocation de mémoire a réussi), elle renvoie un pointeur sur le premier bloc de mémoire. Il renvoie le type de pointeur vide, ce qui signifie que tout type de pointeur peut être affecté.
Cependant, il renvoie NULL si les fonctions malloc ne sont pas en mesure d’allouer la quantité de mémoire requise. La fonction malloc est accessible dans TURBO C, fichier d'en-tête alloc.h
ou stdlib.h
, et sous UNIX, elle sera disponible dans le fichier d'en-tête. .
SYNTAXE
La syntaxe de cette fonction est la suivante:
malloc(number of elements * size of each element);
par exemple, int *ptr;
ptr=malloc(10*sizeof (int))
Où taille représente la taille de la mémoire requise en octets (c'est-à-dire le nombre d'emplacements de mémoire contigus à allouer).
Mais comme mentionné précédemment, la fonction malloc renvoie un pointeur vide. Par conséquent, un opérateur de conversion est requis pour modifier le type de pointeur renvoyé en fonction de nos besoins, la déclaration ci-dessus pourrait être présentée sous la forme suivante:
ptr_var=(type_cast* ) malloc (size)
Où ptr_var
est le nom du pointeur qui conserve l'adresse de départ du bloc de mémoire alloué, type_cast
est le type de données dans lequel le pointeur renvoyé (ou type void) doit être transformé, et size décrit la taille en octets du bloc de mémoire alloué .
Par exemple: int *ptr;
ptr=(int*) malloc (10 * size of (int));
La mémoire allouée par la fonction malloc contient une valeur de mémoire erronée.
Notez que pour vérifier que malloc alloue la mémoire allouée par la RAM système ou que la demande correspondante est générée par malloc (au cas où l’espace requis ne serait pas disponible). Nous pouvons utiliser la propriété dans laquelle la quantité de mémoire nécessaire n'est pas affectée. La fonction malloc renvoie un NULL.
Définition de calloc ()
La fonction calloc fonctionne exactement de la même façon que la fonction malloc, à l'exception du fait qu'elle nécessite deux arguments, comme dans le cas de malloc (), un seul argument est nécessaire.
Par exemple: int*ptr;
ptr = (int*)calloc(10, 2);
Ici 2 spécifie la taille du type de données dans un octet pour lequel nous voulons que l'allocation soit faite, ce qui est le cas dans lequel il s'agit de 2 pour les entiers. Et 10 signifient le nombre d'éléments pour lesquels une affectation doit être faite.
Rappelez-vous que l'argument transmis à la fonction malloc était (n * 10), il s'agit d'un argument unique à ne pas confondre, car plusieurs arguments sont toujours séparés par des virgules. L'argument (n * 10) n'a pas de virgule entre les deux. Il s’agit donc d’un argument unique, mais pas simple, mais d’une expression.
En revenant à la déclaration ci-dessus, après l'exécution de l'instruction ci-dessus, un bloc de mémoire de 20 octets est attribué au programme demandeur et l'adresse du premier bloc est attribuée au programme demandeur et l'adresse du premier bloc est attribuée au pointeur. ptr.
La mémoire allouée par la fonction calloc contient tous les zéros. La fonction calloc est également disponible dans le fichier d’en-tête ou
dans TURBO C.
Différences clés entre malloc et calloc
Les principales différences entre les fonctions malloc et calloc sont les suivantes:
- Un seul bloc de mémoire demandée est attribué dans malloc, tandis que plusieurs blocs de mémoire demandée sont alloués par calloc.
- La fonction malloc n'efface pas et initialise la mémoire allouée. Il contient une valeur de mémoire et un élément de la mémoire allouée ne peut pas être modifié. Au contraire, calloc initialise la mémoire allouée à zéro.
- malloc est plus rapide que calloc en raison de la nécessité d'étapes d'initialisation supplémentaires dans le calloc mais la différence est négligeable.
- Une autre différence entre les deux réside dans le fait que calloc est un malloc + memset, memset alloue les pages physiques en mémoire alors que malloc attribue uniquement la mémoire à partir du segment de mémoire de l'adresse virtuelle.
Conclusion:
Les fonctions malloc et calloc sont utilisées pour l'allocation de la mémoire et ont leur avantage certain. 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.