C Allocation de mémoire dynamique

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 pas 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 de mémoire dynamique dans la 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> En tête de fichier.


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 peuvent être convertis en pointeurs de toute 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 pointeurptrcontient l’adresse du premier octet de la mémoire allouée.

L’expression se traduit par un NULL pointeur si la mémoire ne peut pas être allouée.


C calloc ()

Le nom «calloc» signifie allocation contiguë.

le malloc() alloue de la mémoire et laisse la mémoire non initialisée. Tandis 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 d’eux-mêmes. 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é 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;
} 

Ici, nous avons alloué dynamiquement la mémoire pournnombre 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;
}
 

Réallocation C ()

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,ptrest réaffecté avec une nouvelle tailleX.


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: ");
for(i = 0; i < n1; ++i)
printf("%u\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: ");
for(i = 0; i < n2; ++i)
printf("%u\n", ptr + i);

free(ptr);

return 0;
}