C Allocation de mémoire dynamique à l'aide de malloc (), calloc (), free () & realloc ()

Dans ce tutoriel, 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 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. Ceci est connu sous le nom d'allocation de mémoire dynamique dans la programmation C.

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

C malloc ()

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

La malloc()fonction réserve un bloc de mémoire du nombre d'octets spécifié. Et, il renvoie un pointeur voidqui 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 floatest de 4 octets. Et, le pointeur ptr contient l'adresse du premier octet dans la mémoire allouée.

L'expression génère un NULLpointeur si la mémoire ne peut pas être allouée.

C calloc ()

Le nom «calloc» signifie allocation contiguë.

La malloc()fonction alloue de la mémoire et laisse la mémoire non initialisée. Alors que la calloc()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 ()

La mémoire allouée dynamiquement créée avec l'un calloc()ou l' autre malloc()n'est pas libérée d'elle-même. Vous devez explicitement utiliser 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 #include 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 pour n nombre de int.

Exemple 2: calloc () et free ()

 // Program to calculate the sum of n numbers entered by the user #include #include 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 supérieure à celle requise, vous pouvez modifier la taille de la mémoire allouée précédemment à l'aide de la realloc()fonction.

Syntaxe de realloc ()

 ptr = realloc(ptr, x);

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

Exemple 3: realloc ()

 #include #include 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",ptr + i); printf("Enter 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", ptr + i); free(ptr); return 0; )

Lorsque vous exécutez le programme, la sortie sera:

 Entrez la taille: 2 Adresses de la mémoire précédemment allouée: 26855472 26855476 Entrez la nouvelle taille: 4 Adresses de la mémoire nouvellement allouée: 26855472 26855476 26855480 26855484

Articles intéressants...