ArtsAutosBooksBusinessEducationEntertainmentFamilyFashionFoodGamesGenderHealthHolidaysHomeHubPagesPersonal FinancePetsPoliticsReligionSportsTechnologyTravel
  • »
  • Technology»
  • Computers & Software»
  • Computer Science & Programming»
  • Programming Languages

C Programming Lesson - Dynamic Memory Allocation

Updated on January 23, 2012

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 ?

See results

Comments

    0 of 8192 characters used
    Post Comment

    • profile image

      nandhu 3 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...

    • profile image

      mithoon kumar 4 years ago

      thanks

    • profile image

      harik 4 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 .

    • profile image

      nice coding 5 years ago

      very goodddd work sir

    • profile image

      Gramr 5 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.

    • rajkishor09 profile image
      Author

      RAJKISHOR SAHU 5 years ago from Bangalore, Karnataka, INDIA

      thanks prince....

    • profile image

      PRINCE 5 years ago

      NICE WORK

    • profile image

      Rajeswary 5 years ago

      VERY USEFUL INFORMATION

    • profile image

      S.Graceline Jasmine 5 years ago

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

    • profile image

      skumar 5 years ago

      nice ,i clear malloc,calloc by u tnqs

    • profile image

      SRK RAJ 5 years ago

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

    • profile image

      Puneet 5 years ago

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

    • profile image

      nithya 5 years ago

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

    • profile image

      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

    • profile image

      mahesh 5 years ago

      Thanks it so easy to understand budy

    • profile image

      wantedmaniac 5 years ago

      Thanks Mann . .

    • profile image

      Karan 6 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().

    • profile image

      madbones 6 years ago

      you always give out

      the simplest explanation!

      great job! :)

    • profile image

      kumar samar 6 years ago

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

    • profile image

      Khaled 6 years ago

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

    • profile image

      anurag 7 years ago

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

    • profile image

      kishore 7 years ago

      thanks a lot

    • profile image

      subhash sharma 7 years ago

      Thank u very much for this coding

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