C Programmation

COMMENT UTILISER LA FONCTION MALLOC EN C

COMMENT UTILISER LA FONCTION MALLOC EN 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 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 est toujours ennemie répondant à 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 dans sous forme d'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 est de la responsabilité de 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 ci-dessus i et n. La variable n est l'endroit où nous allons stocker le nombre entré 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 c'est 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 a.

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, on utilise ptr+i, mais ici, dans ce cas, on le déréférence car ptr+i représente une adresse, il faut 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. De nouveau. Nous le déréférençons, il nous donnera donc le 2sd entier. 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 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 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 à partir du tas et qu'ils ne reviennent jamais, c'est une mauvaise programmation, nous devons donc écrire gratuitement (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. Donc, 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!

Jeux HD remasterisés pour Linux qui n'ont jamais eu de version Linux plus tôt
De nombreux développeurs et éditeurs de jeux proposent une remasterisation HD d'anciens jeux pour prolonger la durée de vie de la franchise, veuillez ...
Comment utiliser AutoKey pour automatiser les jeux Linux
AutoKey est un utilitaire d'automatisation de bureau pour Linux et X11, programmé en Python 3, GTK et Qt. En utilisant ses fonctionnalités de script e...
Comment afficher le compteur FPS dans les jeux Linux
Les jeux Linux ont reçu une impulsion majeure lorsque Valve a annoncé la prise en charge de Linux pour le client Steam et leurs jeux en 2012. Depuis l...