- HubPages»
- Technology»
- Computers & Software»
- Computer Science & Programming»
- Programming Languages
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()
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()
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 ?
Related C Programming Links
- A Brief History of the C Language
Before we start any complex program in C, we must understand what really C is, how it came into existence and how it differs from other languages of that time. In this tutorial I will try to talk about these... - Data Types in C Language
A programming language is proposed to help programmer to process certain kinds of data and to provide useful output. The task of data processing is accomplished by executing series of commands called... - Array in C programming Programmer's view
An array in C language is a collection of similar data-type, means an array can hold value of a particular data type for which it has been declared. Arrays can be created from any of the C data-types int,... - How to work with Two Dimensional Arrays in C
We know how to work with an array (1D array) having one dimension. In C language it is possible to have more than one dimension in an array. In this tutorial we are going to learn how we can use two... - Types of Function in C Programming Languages:
In my previous c programming tutorial I tried to explain what the function, its advantages is and how to declare a C function. And I told you that there are five types of functions and they are: ... - What is Function in C Language?
A function in C language is a block of code that performs a specific task. It has a name and it is reusable i.e. it can be executed from as many different parts in a C Program as required. It also ... - How to work with Multidimensional Array in C Programming
C allows array of two or more dimensions and maximum numbers of dimension a C program can have is depend on the compiler we are using. Generally, an array having one dimension is called 1D array, array... - Pointers in C Programming
In this tutorial I am going to discuss what pointer is and how to use them in our C program. Many C programming learner thinks that pointer is one of the difficult topic in C language but its not...
© 2009 RAJKISHOR SAHU