egsoftweb@gmail.com
 facebook.com/egsoftweb

Dynamic memory allocation

 c tutorials |  Admin

If size of array we declared is not fix, then we can allocate memory manually during run-time using inbuilt function like malloc, alloc etc.

This is known as dynamic memory allocation.

There are 4 library functions defined in <stdlib.h> makes dynamic memory allocation in C programming. These are malloc(), calloc(), realloc() and free().


1) malloc() - The name "malloc" stands for memory allocation.

The malloc() function reserves a block of memory of the specified number of bytes. And, it returns a pointer of type void which can be casted into pointer of any form.

Syntax of malloc():

ptr = (cast_type*) malloc(byte_size)

 

Considering the size of int is 4 bytes, this statement allocates 400 bytes of memory. And, the pointer ptr holds the address of the first byte in the allocated memory.

However, if the space is insufficient, allocation fails then returns a NULL pointer.

 

2) calloc() - The name "calloc" stands for contiguous allocation.

The malloc() function allocates a single block of memory. Whereas, calloc() allocates multiple blocks of memory and initializes them to zero.

Syntax of calloc()-

ptr = (cast_type*)calloc(n, element_size);

 

This statement allocates contiguous space in memory for n elements each with the size of element_size.

 

3) free() - Dynamically allocated memory created with either calloc() or malloc() doesn`t get freed on their own. We must use free() to release the space.

Syntax of free()-

free(ptr);

 

This statement frees the space allocated in the memory pointed by ptr.

 

4) realloc() - If the dynamically allocated memory is insufficient or more than required, we can change the size of previously allocated memory using realloc() function.

Syntax of realloc()-

ptr = realloc(ptr, x);

Here, ptr is reallocated with new size x.

Examples:

/* Example: malloc() and free() -

This program calculates the sum of n numbers entered by the user.

To perform this task, memory is dynamically allocated using

malloc(), and memory is freed using free() function.

*/

#include <stdio.h>

#include <stdlib.h>

#define scanf scanf_s

 

int main()

{

     int n, i, *ptr, sum = 0;

     printf("Enter number of elements: ");

     scanf("%d", &n);

     ptr = (int*)malloc(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;

}

 

/*

Example: calloc() and free() -

This program calculates the sum of n numbers entered by the user.

To perform this task, calloc() and free() is used.

*/

#include <stdio.h>

#include <stdlib.h>

#define scanf scanf_s

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;

}

 

/* Example: realloc() */

#include <stdio.h>

#include <stdlib.h>

#define scanf scanf_s

int main()

{

     int *ptr, i, n1, n2;

     printf("Enter size of array: ");

     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 new size of array: ");

     scanf("%d", &n2);

     ptr = (int*)realloc(ptr, n2 * sizeof(int));

     printf("Addresses of newly allocated memory: ");

     for (i = 0; i < n2; ++i)

           printf("%u\n", ptr + i);

     return 0;

}