Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Industrial programming >> Langue C

C Allocation de mémoire dynamique

Allocation de mémoire dynamique C

Dans ce didacticiel, vous apprendrez à allouer dynamiquement de la mémoire dans votre programme C à l'aide des fonctions de bibliothèque standard :malloc(), calloc(), free() et realloc().

Comme vous le savez, un tableau est une collection d'un nombre fixe de valeurs. Une fois la taille d'un tableau déclarée, vous ne pouvez plus la modifier.

Parfois, la taille du tableau que vous avez déclaré peut être insuffisante. Pour résoudre ce problème, vous pouvez allouer de la mémoire manuellement pendant l'exécution. C'est ce qu'on appelle l'allocation dynamique de mémoire en programmation C.

Pour allouer dynamiquement de la mémoire, les fonctions de la bibliothèque sont malloc() , calloc() , realloc() et free() sont utilisés. Ces fonctions sont définies dans le <stdlib.h> fichier d'en-tête.

C malloc()

Le nom "malloc" signifie allocation de mémoire.

Le malloc() La fonction réserve un bloc de mémoire du nombre d'octets spécifié. Et, il renvoie un pointeur de void qui peut être converti en pointeurs de n'importe quelle forme.

Syntaxe de malloc()

ptr = (castType*) malloc(size);

Exemple

ptr = (float*) malloc(100 * sizeof(float));

L'instruction ci-dessus alloue 400 octets de mémoire. C'est parce que la taille de float est de 4 octets. Et, le pointeur ptr contient l'adresse du premier octet dans la mémoire allouée.

L'expression donne un NULL pointeur si la mémoire ne peut pas être allouée.

C calloc()

Le nom "calloc" signifie allocation contiguë.

Le malloc() la fonction alloue de la mémoire et laisse la mémoire non initialisée, alors que le calloc() La fonction alloue de la mémoire et initialise tous les bits à zéro.

Syntaxe de calloc()

ptr = (castType*)calloc(n, size);

Exemple :

ptr = (float*) calloc(25, sizeof(float));

L'instruction ci-dessus alloue un espace contigu en mémoire pour 25 éléments de type float .

C libre()

Mémoire allouée dynamiquement créée avec soit calloc() ou malloc() ne se libère pas tout seul. Vous devez utiliser explicitement free() pour libérer l'espace.

Syntaxe de free()

free(ptr);

Cette instruction libère l'espace alloué dans la mémoire pointée par ptr .

Exemple 1 :malloc() et free()

// Program to calculate the sum of n numbers entered by the user

#include <stdio.h>
#include <stdlib.h>

int main() {
  int n, i, *ptr, sum = 0;

  printf("Enter number of elements: ");
  scanf("%d", &n);

  ptr = (int*) malloc(n * sizeof(int));
 
  // if memory cannot be allocated
  if(ptr == NULL) {
    printf("Error! memory not allocated.");
    exit(0);
  }

  printf("Enter elements: ");
  for(i = 0; i < n; ++i) {
    scanf("%d", ptr + i);
    sum += *(ptr + i);
  }

  printf("Sum = %d", sum);
  
  // deallocating the memory
  free(ptr);

  return 0;
}

Sortie

Enter number of elements: 3
Enter elements: 100
20
36
Sum = 156

Ici, nous avons dynamiquement alloué la mémoire pour n nombre de int .

Exemple 2 :calloc() et free()

// Program to calculate the sum of n numbers entered by the user

#include <stdio.h>
#include <stdlib.h>

int main() {
  int n, i, *ptr, sum = 0;
  printf("Enter number of elements: ");
  scanf("%d", &n);

  ptr = (int*) calloc(n, sizeof(int));
  if(ptr == NULL) {
    printf("Error! memory not allocated.");
    exit(0);
  }

  printf("Enter elements: ");
  for(i = 0; i < n; ++i) {
    scanf("%d", ptr + i);
    sum += *(ptr + i);
  }

  printf("Sum = %d", sum);
  free(ptr);
  return 0;
}

Sortie

Enter number of elements: 3
Enter elements: 100
20
36
Sum = 156

C realloc()

Si la mémoire allouée dynamiquement est insuffisante ou plus que nécessaire, vous pouvez modifier la taille de la mémoire précédemment allouée à l'aide du realloc() fonction.

Syntaxe de realloc()

ptr = realloc(ptr, x);

Ici, ptr est réalloué avec une nouvelle taille x .

Exemple 3 :realloc()

#include <stdio.h>
#include <stdlib.h>

int main() {
  int *ptr, i , n1, n2;
  printf("Enter size: ");
  scanf("%d", &n1);

  ptr = (int*) malloc(n1 * sizeof(int));

  printf("Addresses of previously allocated memory:\n");
  for(i = 0; i < n1; ++i)
    printf("%pc\n",ptr + i);

  printf("\nEnter the new size: ");
  scanf("%d", &n2);

  // rellocating the memory
  ptr = realloc(ptr, n2 * sizeof(int));

  printf("Addresses of newly allocated memory:\n");
  for(i = 0; i < n2; ++i)
    printf("%pc\n", ptr + i);
  
  free(ptr);

  return 0;
}

Sortie

Enter size: 2
Addresses of previously allocated memory:
26855472
26855476

Enter the new size: 4
Addresses of newly allocated memory:
26855472
26855476
26855480
26855484

Langue C

  1. Mémoire en lecture seule (ROM)
  2. Microprocesseurs
  3. Gestion de la mémoire C++ :création et suppression
  4. Cervoz met à niveau la mémoire DDR4-2666 de nouvelle génération
  5. Allocation dynamique C++ de tableaux avec exemple
  6. Fonction calloc() dans la bibliothèque C avec l'EXEMPLE de programme
  7. Fonction realloc() dans la bibliothèque C :comment l'utiliser ? Syntaxe et exemple
  8. C - Gestion de la mémoire
  9. Une tarification dynamique dans la vente au détail traditionnelle est inévitable