C Programming Lesson - Dynamic Memory Allocation

This tutorial is intended to tell beginner the power of pointers in C programming. This tutorial will try to explain how with the help of pointer we can solve the problem of memory management. If you don’t know what pointer is in C language then please click here to learn it now.

We have used variable which requires all variables to be declared before we use it. So if we need to store 100 students roll no then we need to declare 100 individual integer variables. This problem can be solved with the help of array; single array declaration can store 100 or more integer values. One of the biggest limitation is array size cannot be increased or decreased during execution of a program. To get this better consider the following C program statement:

int roll_no[100];

Suppose we want to store roll_no of 100 students (200 bytes of memory occupied due to above declaration) and above C language statement will do the same task. During C program execution I thought that I will enter only 40 students’ roll_no. This decision of entering only 40 students’ roll_no will use 80 bytes out of 200 bytes (2 bytes per integer*40 students) of memory and remaining 120 bytes of memory will be useless.

If we want to store 150 students’ roll_no using same program, we cannot do so because we have declared array to store only 100 students’ roll_no. To overcome this memory allocation problem we need to dynamically allocate memory according to user input. We can do this with C’s two inbuilt functions calloc, malloc and a pointer. Calloc and malloc is two functions which help to dynamically allocate memory at runtime (during program execution) and this can reduce memory wastage problem.

C Program to show Dynamic Memory Allocation using Malloc()

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

void main()
{
	int no, *pt,i;
	clrscr();

	printf("Enter no of Students :");
	scanf("%d",&no);
	pt=(int *)malloc(no*2);
	if(pt== NULL)
	{
		printf("\n\nMemory allocation failed!");
		getch();
		exit(0);
	}

	printf("* * * * Enter roll no of students. * * * *\n");
	for (i=0;i<no;i++)
	{
		printf("-->");
		scanf("%d",(pt+i));
	}

	printf("\n* * * * Entered roll no. * * * *\n");
	for (i=0;i<no;i++)
	{
		printf("%d, ",*(pt+i));
	}

	getch();
}

Dynamic Memory Allocation using Malloc()

Output of the above c program.
Output of the above c program.

Code Explanation:

Let’s dig out the above program; this is a simple c program example which uses integer pointer to dynamically allocate memory according to user’s input at runtime. As I told you earlier that we can do this either with malloc() or calloc(). In this example I am using malloc() and calloc() is explained below. To use malloc() or calloc() function we must include stdlib.h or alloc.h header file otherwise you will get malloc prototype error at compilation. Line no. 3 includes the stdlib.h header file. In line no. 7 an integer pointer pt and some other integer is declared which we will need later in input and loop. Line no. 11 stores integer number in no variable which is used as number of students whose roll number we are going to input. Next line (line no. 12) is most important one in this program; it does all allocation jobs. If malloc function is able to allocate memory then it returns address of memory chunk that was allocated else it returns NULL.

pt=(int *)malloc(no*2);

As you already know that malloc is a function, it requires one parameter or argument i.e. number of bytes to reserve. In our program we provided no*2 as parameter. The variable no holds the number of students whose roll no we are going to enter. But why we are multiplying no with 2? Here is answer, suppose we want to store roll number of 10 students. We stored 10 in no variable and passed this no variable in malloc function. But do you think it will work? Because integer occupies 2 bytes and we wanted to store 10 students information. And if we pass 10 to malloc then compiler will reserve 10 bytes only which can store only 5 students’ information. To solve this issue I have multiplied no with 2 so if you enter 10 then it will reserve 20 bytes of memory. If you don’t remember which data type occupies how much memory then you can use sizeof() which return data type size.

pt=(int *)malloc(no*sizeof(int));

Just before malloc() I have used (int *), this is called type casting (means converting from one data type to other compatible data type). If memory allocation is successful then malloc() by default returns pointer to a void and we type cast that to integer pointer and stores the address in pt integer pointer variable. So pt pointer contains starting address of memory allocated using malloc().

If, due any reason, malloc() fails to allocate memory it returns NULL. Line no. 13 – 18 does the same job, if malloc() fails to allocate memory the it will show error and exit from program.

Line no 21 – 25 is used to take roll no of student and store it in memory. Look at line no. 24 and particularly at (pt + i) statement. Integer pointer pt contains starting address of memory which is allocated by malloc() and by adding i variable value we are instructing it to move further to store value in that memory chunk. For example, if pointer starting address is 1002 then (pt+1) would mean 1004, (pt+2) = 1006 and so on.

Line no. 28 – 31 prints the value stored in the memory and thing is simple.

C Program to show Dynamic Memory Allocation using Calloc()

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

void main()
{
	int no, *pt,i;
	clrscr();

	printf("Enter no of Students :");
	scanf("%d",&no);
	pt=(int *)calloc(no,2);
	if(pt== NULL)
	{
		printf("\n\nMemory allocation failed!");
		getch();
		exit(0);
	}

	printf("* * * * Enter roll no of students. * * * *\n");
	for (i=0;i<no;i++)
	{
		printf("-->");
		scanf("%d",(pt+i));
	}

	printf("\n* * * * Entered roll no. * * * *\n");
	for (i=0;i<no;i++)
	{
		printf("%d, ",*(pt+i));
	}

	getch();
}

Dynamic Memory Allocation using Calloc()

Output of the above c program.
Output of the above c program.

Code Explanation:

Above is the same example what we have explained in malloc(), the only difference is here we used calloc(). As you all know calloc() malloc() function does the same job but calloc() is a bit differ from malloc(). Calloc() takes two values as its parameter whereas malloc() takes one parameter. In line no 12 calloc() has two arguments 10,2. Here 2 indicates that we want to store integer value so make per block 2 bytes and 10 indicates that we want to store 10 integer values.

One more important difference between calloc() and malloc() is that by default memory allocated by malloc() contains garbage values whereas memory allocated by calloc() contains all 0 (zero). Rest code is explained earlier in malloc explanation section.

Your Opinion

Is this tutorial on Dynamic Memory Allocation using Pointer helpful ?

  • Yes
  • No
  • I need more example and explaination.
See results without voting

More by this Author


Comments 23 comments

subhash sharma 6 years ago

Thank u very much for this coding

ur coding process is very simple ,all student easily caught them


kishore 6 years ago

thanks a lot


anurag 6 years ago

this is great ,a basic program on dynamic memory allocation is all that i was looking for.


Khaled 6 years ago

Simple and Brilliant....Thank you very much!


kumar samar 5 years ago

good job,boss.what is the memory of above declararion?


madbones 5 years ago

you always give out

the simplest explanation!

great job! :)


Karan 5 years ago

This is a very good explanation on DMA.

This tutorial could have been much better if you would have had used some other functions like realloc(),calloc,free().


wantedmaniac 5 years ago

Thanks Mann . .


mahesh 5 years ago

Thanks it so easy to understand budy


Santoshkumar M 5 years ago

Hi,Thanks for the info and I have one doubt,when you type (pt+i),how it is getting incremented by two,My understanding if the starting address is 1002, for first time execution of (pt+i) it will result in 1003 as the next memory location.how can it be 1004,1006 and so on can you pls explain in details


nithya 5 years ago

since int occupies two bytes in the memory,if the starting address is 1002, the next will naturally be 1004.


Puneet 4 years ago

Good job mann...this coding help me a lot.


SRK RAJ 4 years ago

NO MAN ITS OF NO USE TO ME BECAUSE I WANT TO STORE AND PRINT STUDENT'S INFORMATION


skumar 4 years ago

nice ,i clear malloc,calloc by u tnqs


S.Graceline Jasmine 4 years ago

1D Dynamic allocation is very clear. Can you provide the same for 2D and 3D array dynamic allocation??


Rajeswary 4 years ago

VERY USEFUL INFORMATION


PRINCE 4 years ago

NICE WORK


rajkishor09 profile image

rajkishor09 4 years ago from Bangalore, Karnataka, INDIA Author

thanks prince....


Gramr 4 years ago

Thank you very much, this is a perfect example of how the teaching system should work. Examples and problem solving are way better than forcing theory into students with no example whatsoever.


nice coding 4 years ago

very goodddd work sir


harik 3 years ago

thank u,

pt=(int *)malloc(no*2); in this statement i skipped the value "2" and i had entered the roll number of ten students ,and i got the o/p without any error .


mithoon kumar 3 years ago

thanks


nandhu 2 years ago

hi! i want to know that malloc nad calloc have lit bit differ in malloc single block of memory can assign and calloc multiple block of memory can assing how the memory is assingning for the both...

    Sign in or sign up and post using a HubPages Network account.

    0 of 8192 characters used
    Post Comment

    No HTML is allowed in comments, but URLs will be hyperlinked. Comments are not for promoting your articles or other sites.


    Click to Rate This Article
    working