Gestion de la mémoire C


Ce chapitre expliquera la gestion dynamique de la mémoire en C. Le langage C fournit plusieurs fonctions d'allocation et de gestion de la mémoire. Ces fonctions se trouvent dans le fichier d'en-tête <stdlib.h>.

< td >1
Numéro de sérieFonction et description
序号函数和描述
1void *calloc(int num, int size);
该函数分配一个带有 num 个元素的数组,每个元素的大小为 size 字节。
2void free(void *address);
该函数释放 address 所指向的h内存块。
3void *malloc(int num);
该函数分配一个 num 字节的数组,并把它们进行初始化。
4void *realloc(void *address, int newsize);
该函数重新分配内存,把内存扩展到 newsize
void *calloc(int num, int size);
Cette fonction alloue un tableau avec

num

éléments, chaque élément La taille de est

taille

octets.
2

void free(void *address);

Cette fonction libère le bloc mémoire h pointé par adresse .

3

void *malloc(int num);

Cette fonction alloue un num

tableaux d’octets et initialisez-les.
4

void *realloc(void *address, int newsize);

Cette fonction réalloue la mémoire et met de la mémoire s'étend à

newsize

.

Allocation dynamique de mémoire

Lors de la programmation, si vous connaissez la taille du tableau à l'avance, alors quand définir le tableau C'est plus simple. Par exemple, un tableau pour stocker les noms de personnes, il peut contenir jusqu'à 100 caractères, vous pouvez donc définir le tableau comme ceci :

char name[100];

Cependant, si vous ne connaissez pas à l'avance la longueur du texte dont vous avez besoin à stocker, par exemple vous souhaitez stocker la description détaillée d'un sujet. Ici, nous devons définir un pointeur qui pointe vers un caractère avec une taille de mémoire non définie, puis allouer de la mémoire en fonction de la demande, comme indiqué ci-dessous :

#include <stdio.h>#include <stdlib.h>#include <string.h>int main(){   char name[100];   char *description;

   strcpy(name, "Zara Ali");   /* 动态分配内存 */
   description = malloc( 200 * sizeof(char) );   if( description == NULL )   {
      fprintf(stderr, "Error - unable to allocate required memory\n");   }   else   {
      strcpy( description, "Zara ali a DPS student in class 10th");   }
   printf("Name = %s\n", name );
   printf("Description: %s\n", description );}

Lorsque le code ci-dessus est compilé et exécuté, il produira les résultats suivants :

Name = Zara AliDescription: Zara ali a DPS student in class 10th

Le programme ci-dessus peut également être écrit en utilisant
calloc()<🎜>, remplacez simplement malloc par calloc, comme indiqué ci-dessous : <🎜>
calloc(200, sizeof(char));
< 🎜>Lors de l'allocation dynamique de mémoire , vous avez un contrôle total et pouvez transmettre des valeurs de n'importe quelle taille. Les tableaux avec des tailles prédéfinies ne peuvent pas être modifiés en taille une fois définis. <🎜><🎜>Redimensionnez la mémoire et libérez de la mémoire<🎜><🎜>Lorsque le programme se termine, le système d'exploitation libérera automatiquement toute la mémoire allouée au programme. Cependant, il est recommandé de l'appeler chaque fois que vous ne le faites pas. besoin de mémoire. Fonction <🎜>free()<🎜> pour libérer de la mémoire. <🎜><🎜>Alternativement, vous pouvez augmenter ou diminuer la taille du bloc mémoire alloué en appelant la fonction <🎜>realloc()<🎜>. Regardons à nouveau l'exemple ci-dessus en utilisant les fonctions realloc() et free() : <🎜>
#include <stdio.h>#include <stdlib.h>#include <string.h>int main(){   char name[100];   char *description;

   strcpy(name, "Zara Ali");   /* 动态分配内存 */
   description = malloc( 30 * sizeof(char) );   if( description == NULL )   {
      fprintf(stderr, "Error - unable to allocate required memory\n");   }   else   {
      strcpy( description, "Zara ali a DPS student.");   }   /* 假设您想要存储更大的描述信息 */
   description = realloc( description, 100 * sizeof(char) );   if( description == NULL )   {
      fprintf(stderr, "Error - unable to allocate required memory\n");   }   else   {
      strcat( description, "She is in class 10th");   }
   
   printf("Name = %s\n", name );
   printf("Description: %s\n", description );   /* 使用 free() 函数释放内存 */
   free(description);}
<🎜>Lorsque le code ci-dessus est compilé et exécuté, il produit les résultats suivants : <🎜>
Name = Zara AliDescription: Zara ali a DPS student.She is in class 10th
<🎜>Vous pouvez si vous essayez sans réallouer de la mémoire supplémentaire, la fonction strcat() générera une erreur car la mémoire disponible est insuffisante pour stocker la description. <🎜><🎜>