Allocation dynamique de mémoire en C : fonctions malloc(), calloc()
Avant d’apprendre l’allocation dynamique de mémoire en C, comprenons :
Comment fonctionne la gestion de la mémoire en C ?
Lorsque vous déclarez une variable en utilisant un type de données de base, le compilateur C alloue automatiquement un espace mémoire pour la variable dans un pool de mémoire appelé la pile.
Par exemple, une variable float prend typiquement 4 octets (selon la plateforme) lorsqu’elle est déclarée. Nous pouvons vérifier cette information en utilisant l’opérateur sizeof comme le montre l’exemple ci-dessous
#include <stdio.h>int main() { float x; printf("The size of float is %d bytes", sizeof(x)); return 0;}
La sortie sera :
The size of float is 4 bytes
De plus, un tableau avec une taille spécifiée est alloué en blocs contigus de mémoire, chaque bloc a la taille d’un élément :
#include <stdio.h>int main() { float arr;printf("The size of the float array with 10 element is %d", sizeof(arr)); return 0;}
Le résultat est :
The size of the float array with 10 element is 40
Comme appris jusqu’ici, lors de la déclaration d’un type de données de base ou d’un tableau, la mémoire est automatiquement gérée. Cependant, il existe un processus d’allocation de mémoire en C qui vous permettra de mettre en œuvre un programme dans lequel la taille du tableau est indécise jusqu’à l’exécution de votre programme (runtime). Ce processus est appelé « allocation dynamique de mémoire ».
Dans ce tutoriel, vous allez apprendre-
- Comment fonctionne la gestion de la mémoire en C ?
- Allocation dynamique de mémoire en C
- La fonction malloc() en C
- La fonction free()
- La fonction calloc() en C
- Calloc() vs. malloc() : Principales différences
- Fonction C realloc()
- Réseaux dynamiques
Allocation dynamique de mémoire en C
L’allocation dynamique de mémoire consiste à allouer et à libérer manuellement de la mémoire en fonction de vos besoins de programmation. La mémoire dynamique est gérée et servie avec des pointeurs qui pointent vers l’espace mémoire nouvellement alloué dans une zone que nous appelons le tas.
Maintenant, vous pouvez créer et détruire un tableau d’éléments de manière dynamique au moment de l’exécution sans aucun problème. Pour résumer, la gestion automatique de la mémoire utilise la pile, et l’allocation dynamique de mémoire en C utilise le tas.
La bibliothèque <stdlib.h> possède des fonctions responsables de la gestion dynamique de la mémoire.
Fonction | Objectif |
malloc() | Allocation de la mémoire de taille demandée et renvoi du pointeur vers le premier octet de l’espace alloué. |
Calloc() | Allocation de l’espace pour les éléments d’un tableau. Initialise les éléments à zéro et renvoie un pointeur vers la mémoire. |
Ralloc() | Il est utilisé pour modifier la taille de l’espace mémoire précédemment alloué. |
Free() | Elle libère ou vide l’espace mémoire précédemment alloué. |
Discutons des fonctions ci-dessus avec leur application
Fonction C malloc()
La fonction C malloc() représente l’allocation de mémoire. C’est une fonction qui est utilisée pour allouer un bloc de mémoire de manière dynamique. Elle réserve un espace mémoire de taille spécifiée et renvoie le pointeur nul pointant sur l’emplacement mémoire. Le pointeur renvoyé est généralement de type void. Cela signifie que nous pouvons attribuer la fonction C malloc() à n’importe quel pointeur.
Syntaxe de la fonction malloc() :
ptr = (cast_type *) malloc (byte_size);
Ici,
- ptr est un pointeur de type cast_type.
- La fonction C malloc() renvoie un pointeur vers la mémoire allouée de taille byte_size.
Exemple de malloc() :
Example: ptr = (int *) malloc (50)
Lorsque cette instruction est exécutée avec succès, un espace mémoire de 50 octets est réservé. L’adresse du premier octet de l’espace réservé est affectée au pointeur ptr de type int.
Considérez un autre exemple :
#include <stdlib.h>int main(){int *ptr;ptr = malloc(15 * sizeof(*ptr)); /* a block of 15 integers */ if (ptr != NULL) { *(ptr + 5) = 480; /* assign 480 to sixth integer */ printf("Value of the 6th integer is %d",*(ptr + 5)); }}
Sortie :
Value of the 6th integer is 480
- Notez que sizeof(*ptr) a été utilisé au lieu de sizeof(int) afin de rendre le code plus robuste lorsque la déclaration *ptr est typée vers un type de données différent plus tard.
- L’allocation peut échouer si la mémoire n’est pas suffisante. Dans ce cas, elle renvoie un pointeur NULL. Vous devez donc inclure du code pour vérifier la présence d’un pointeur NULL.
- N’oubliez pas que la mémoire allouée est contiguë et qu’elle peut être traitée comme un tableau. Nous pouvons utiliser l’arithmétique des pointeurs pour accéder aux éléments du tableau plutôt que d’utiliser des parenthèses . Nous conseillons d’utiliser + pour se référer aux éléments du tableau car l’utilisation de l’incrémentation ++ ou += change l’adresse stockée par le pointeur.
La fonction Malloc() peut également être utilisée avec le type de données de caractères ainsi que les types de données complexes tels que les structures.
La fonction free()
La mémoire des variables est automatiquement désallouée au moment de la compilation. Dans l’allocation dynamique de la mémoire, vous devez désallouer la mémoire explicitement. Si ce n’est pas fait, vous pouvez rencontrer une erreur de type out of memory.
La fonction free() est appelée pour libérer/désallouer la mémoire en C. En libérant la mémoire dans votre programme, vous en rendez plus disponible pour une utilisation ultérieure.
Par exemple :
#include <stdio.h>int main() {int* ptr = malloc(10 * sizeof(*ptr));if (ptr != NULL){ *(ptr + 2) = 50; printf("Value of the 2nd integer is %d",*(ptr + 2));}free(ptr);}
Sortie
Value of the 2nd integer is 50
Fonction C calloc()
La fonction C calloc() signifie allocation contiguë. Cette fonction est utilisée pour allouer plusieurs blocs de mémoire. C’est une fonction d’allocation dynamique de la mémoire qui est utilisée pour allouer la mémoire à des structures de données complexes telles que les tableaux et les structures.
La fonction malloc() est utilisée pour allouer un seul bloc d’espace mémoire alors que la fonction calloc() en C est utilisée pour allouer plusieurs blocs d’espace mémoire. Chaque bloc alloué par la fonction calloc() est de la même taille.
Syntaxe de la fonction calloc() :
ptr = (cast_type *) calloc (n, size);
- L’instruction ci-dessus est utilisée pour allouer n blocs de mémoire de même taille.
- Après l’allocation de l’espace mémoire, alors tous les octets sont initialisés à zéro.
- Le pointeur qui est actuellement au premier octet de l’espace mémoire alloué est retourné.
Lorsqu’il y a une erreur d’allocation de l’espace mémoire comme le manque de mémoire, alors un pointeur nul est renvoyé.
Exemple de calloc() :
Le programme ci-dessous calcule la somme d’une suite arithmétique.
#include <stdio.h> int main() { int i, * ptr, sum = 0; ptr = calloc(10, sizeof(int)); if (ptr == NULL) { printf("Error! memory not allocated."); exit(0); } printf("Building and calculating the sequence sum of the first 10 terms \ n "); for (i = 0; i < 10; ++i) { * (ptr + i) = i; sum += * (ptr + i); } printf("Sum = %d", sum); free(ptr); return 0; }
Résultat :
Building and calculating the sequence sum of the first 10 termsSum = 45
calloc() vs. malloc() : Principales différences
Voici les principales différences entre malloc() Vs calloc() en C :
La fonction calloc() est généralement plus adaptée et efficace que celle de la fonction malloc(). Alors que les deux fonctions sont utilisées pour allouer de l’espace mémoire, calloc() peut allouer plusieurs blocs en une seule fois. Vous n’avez pas besoin de demander un bloc de mémoire à chaque fois. La fonction calloc() est utilisée dans les structures de données complexes qui nécessitent un espace mémoire plus important.
Le bloc de mémoire alloué par un calloc() en C est toujours initialisé à zéro alors que dans la fonction malloc() en C, il contient toujours une valeur poubelle.
Fonction realloc() en C
En utilisant la fonction realloc() en C, vous pouvez ajouter une taille de mémoire supplémentaire à une mémoire déjà allouée. Elle étend le bloc actuel tout en laissant le contenu original tel quel. realloc() en C signifie réaffectation de la mémoire.
realloc() peut également être utilisée pour réduire la taille de la mémoire précédemment allouée.
Syntaxe de la fonction realloc() :
ptr = realloc (ptr,newsize);
L’instruction ci-dessus alloue un nouvel espace mémoire avec une taille spécifiée dans la variable newsize. Après l’exécution de la fonction, le pointeur sera renvoyé au premier octet du bloc mémoire. La nouvelle taille peut être plus grande ou plus petite que la mémoire précédente. Nous ne pouvons pas être sûrs que le bloc nouvellement alloué pointera vers le même emplacement que celui du bloc de mémoire précédent. Cette fonction copiera toutes les données précédentes dans la nouvelle région. Elle permet de s’assurer que les données resteront en sécurité.
Exemple de realloc() :
#include <stdio.h>int main () { char *ptr; ptr = (char *) malloc(10); strcpy(ptr, "Programming"); printf(" %s, Address = %u\n", ptr, ptr); ptr = (char *) realloc(ptr, 20); //ptr is reallocated with new size strcat(ptr, " In 'C'"); printf(" %s, Address = %u\n", ptr, ptr); free(ptr); return 0;}
Lorsque la fonction realloc() en C aboutit à une opération infructueuse, elle renvoie un pointeur nul, et les données précédentes sont également libérées.
Tableaux dynamiques en C
Un tableau dynamique en C permet au nombre d’éléments d’augmenter selon les besoins. Les tableaux dynamiques en C sont largement utilisés dans les algorithmes de l’informatique.
Dans le programme suivant, nous avons créé et redimensionné un tableau dynamique en C
#include <stdio.h> int main() { int * arr_dynamic = NULL; int elements = 2, i; arr_dynamic = calloc(elements, sizeof(int)); //Array with 2 integer blocks for (i = 0; i < elements; i++) arr_dynamic = i; for (i = 0; i < elements; i++) printf("arr_dynamic=%d\n", i, arr_dynamic); elements = 4; arr_dynamic = realloc(arr_dynamic, elements * sizeof(int)); //reallocate 4 elements printf("After realloc\n"); for (i = 2; i < elements; i++) arr_dynamic = i; for (i = 0; i < elements; i++) printf("arr_dynamic=%d\n", i, arr_dynamic); free(arr_dynamic); }
Résultat du programme de tableau dynamique en C à l’écran :
arr_dynamic=0arr_dynamic=1After reallocarr_dynamic=0arr_dynamic=1arr_dynamic=2arr_dynamic=3
Sommaire
- Nous pouvons gérer dynamiquement la mémoire en créant des blocs de mémoire selon les besoins dans le tas
- Dans l’allocation dynamique de mémoire en C, la mémoire est allouée lors d’une exécution.
- L’allocation dynamique de mémoire permet de manipuler des chaînes et des tableaux dont la taille est flexible et peut être modifiée à tout moment dans votre programme.
- Elle est nécessaire lorsque vous n’avez aucune idée de la quantité de mémoire qu’une structure particulière va occuper.
- Malloc() en C est une fonction d’allocation de mémoire dynamique qui représente l’allocation de mémoire que des blocs de mémoire avec la taille spécifique initialisée à une valeur de poubelle
- Calloc() en C est une fonction d’allocation de mémoire contiguë qui alloue plusieurs blocs de mémoire à la fois initialisée à 0
- Realloc() en C est utilisé pour réallouer la mémoire selon la taille spécifiée.
- La fonctionFree() est utilisée pour effacer la mémoire allouée dynamiquement.
.