COMMENT UTILISER LA FONCTION MALLOC EN C

How Use Malloc Function C



Malloc est une fonction intégrée déclarée dans le fichier d'en-tête . Malloc est le nom abrégé de « allocation de mémoire » et est utilisé pour allouer dynamiquement un seul gros bloc de mémoire contiguë en fonction de la taille spécifiée. Il existe deux types d'allocation de mémoire statique et dynamique. L'allocation de mémoire statique est effectuée au moment de la compilation et ne change pas au moment de l'exécution. L'allocation de mémoire dynamique alloue de la mémoire au moment de l'exécution pour cela ; nous utilisons malloc. Maintenant, le point est de savoir d'où vient cette mémoire, donc toutes les exigences dynamiques en C sont remplies à partir de la mémoire de tas. Fondamentalement, notre application/programme aura 3 types de mémoire

  • La mémoire de la pile est locale pour chaque méthode, et lorsque la méthode revient, la pile l'efface automatiquement.
  • La zone de mémoire globale alloue de la mémoire pour toutes les variables globales. Cette zone mémoire est créée au début du programme, et à la fin, elle efface automatiquement la zone mémoire.
  • La mémoire de tas répond toujours à toutes les exigences dynamiques du programme/application. Chaque fois que nous allons utiliser la fonction malloc, elle va emprunter de la mémoire au tas et nous donner le pointeur vers elle.

Syntaxe:







La syntaxe de malloc est (void*)malloc(size_t size). Donc, la syntaxe dit que malloc nécessite une taille, il renverra le pointeur essentiellement un pointeur vide et la taille t est définie comme un entier non signé. La fonction Malloc alloue simplement un bloc mémoire en fonction de la taille spécifiée dans le tas comme vous pouvez le voir dans la syntaxe cette taille doit être spécifiée et, en cas de succès, elle renvoie un pointeur pointant sur le premier octet de la mémoire allouée sinon renvoie NULL . Ainsi, le travail de malloc est d'allouer de la mémoire au moment de l'exécution.



Pourquoi void pointeur :

Malloc n'a aucune idée de ce qu'il désigne ; cela signifie simplement qu'il ne sait pas quelles données seront stockées dans cet emplacement mémoire. Il alloue simplement la mémoire demandée par l'utilisateur sans connaître le type de données à stocker à l'intérieur de la mémoire. C'est pourquoi il renvoie un pointeur void.



Malloc alloue simplement de la mémoire après quoi il incombe à l'utilisateur de transtyper dans un type approprié afin qu'il puisse être utilisé correctement dans le programme. Le pointeur vide est un pointeur qui peut pointer n'importe quel type de données malloc renvoie un pointeur vide car il ne sait pas quel type de données sera stocké dans cette mémoire.





Ici, nous demandons à malloc d'allouer 6 octets de mémoire maintenant si c'est un succès, malloc renverra un pointeur void. Dans ce cas, nous devons le transtyper en un pointeur de type entier car nous voulons stocker un entier dans cette mémoire. Ici, malloc alloue 6 octets de mémoire dans un tas, et l'adresse du premier octet est stockée dans le pointeur ptr.



Exemple de programme :

Voici un exemple de programme simple afin de bien comprendre le concept de malloc.

Ici, vous pouvez voir avec la fonction printf que je demande à l'utilisateur d'entrer le nombre d'entiers. Nous avons déclaré deux variables au-dessus de i et n. La variable n est l'endroit où nous allons stocker le nombre saisi par l'utilisateur. Après cela, nous avons la fonction malloc ; nous voulons que le malloc alloue la taille équivalente à la taille de n entiers. Nous multiplions size if int avec n; cela nous donnera la taille de n entiers. Après cela, malloc renverra un pointeur void, et nous le transtyperons en un pointeur entier, et nous stockons l'adresse dans le pointeur ptr. Le transtypage est important car il s'agit d'une bonne pratique.

Maintenant, si le pointeur contient NULL, cela signifie que la mémoire n'est pas disponible. Nous allons donc simplement quitter le programme avec le statut d'échec de sortie. Si ce n'est pas le cas, nous pouvons facilement exécuter la boucle for.

La boucle s'exécutera de 0 à n-1, et nous demanderons à l'utilisateur d'entrer les entiers un par un à chaque fois. Dans la fonction scanf, il y a une chose écrite ptr+i car nous savons que ptr contient l'adresse du premier octet de mémoire. Disons que l'adresse est 1000 ici i est égal à zéro au départ donc 1000+0 est 1000 donc à l'intérieur de cette adresse notre premier entier sera stocké puis après cela quand i devient 1 donc 1000+1 qui a été interprété en interne comme (1000) +1 *4 si je suppose que la taille de l'entier est de 4 octets et qu'elle serait égale à 1004, donc le prochain entier sera stocké dans l'emplacement 1004. Et cela continuera de cette manière, les adresses sont comme 1000, 1004, 1008 et ainsi de suite. Nous n'utilisons pas d'esperluette avant ptr+i parce que ptr nous donne déjà l'adresse lorsque nous écrivons ptr, qui est simplement un pointeur, et il contient l'adresse, pas la valeur, il n'est donc pas nécessaire de mettre une esperluette avant, et ce concept doit être clair.

Ici, dans cette boucle, nous faisons simplement une chose, nous imprimons tous les nombres entiers à l'écran ; évidemment, nous utilisons ptr+i, mais ici, dans ce cas, nous la déréférençons car ptr+i représente une adresse, nous devons donc la déréférencer. Si i est égal à 0, ce sera 1000 car nous supposons que la première adresse sera 1000, donc nous la déréférençons ; nous obtiendrons le premier entier puis i égal à 1, et il deviendra 1001 mais interprété comme 1004 si la taille de l'entier est 4. Encore une fois. Nous le déréférençons, il nous donnera donc le 2sdentier. De cette façon, tout fonctionne.

Donc, il s'agit essentiellement d'un programme simple qui demande aux utilisateurs d'entrer n entier, puis nous affichons simplement ces entiers à l'écran. Après l'exécution du programme, cela s'affichera.

Tout d'abord, nous demandons à l'utilisateur d'entrer le nombre d'entiers, puis l'utilisateur entre les entiers et nous les affichons simplement à l'écran.

Conclusion:

Il n'y a rien de mal dans le programme ci-dessus tant que nous le poursuivons pendant très longtemps, ici, nous empruntons de la mémoire au tas, mais nous ne retournons jamais la mémoire au tas, cela ne se produit que dans le cas où le programme/l'application ont pour courir pendant une longue durée comme 24 heures. Ils appelleront à nouveau la fonction malloc, et encore une fois, cela signifie qu'à chaque fois qu'ils empruntent de la mémoire au tas et ne reviennent jamais, c'est une mauvaise programmation, nous devons donc écrire free (l'adresse de mémoire qui doit être libérée) avant de revenir. Donc, chaque fois que l'utilisation de malloc free est importante. Ainsi, en utilisant malloc, nous avons conservé de la mémoire, et malloc alloue de la mémoire aussi grande que vous le lui demandez.

Bonne allocation de mémoire dynamique !