The compiler allocates memory for the local variables on the stack. And there is a possibility that we can allocate memory on the heap using the memory allocation functions
1 |
malloc, calloc and realloc |
Stack memory allocation:
The stack memory is allocated when the local variable is found by the compiler and freed when the variable goes out of the scope
1 2 3 |
void myFun () { int i; // memory is allocated on the stack } |
The memory is de-allocated when the scope of the variable goes out of scope.
The address is allocated statically for the local variables and the function arguments.
Heap memory allocation:
The heap memory is allocated when we allocate the memory using malloc / calloc/ realloc and freed when we call the function “free”.malloc is a function that finds a chunk of free memory of the desired size and returns a pointer to it. free marks the memory associated with a specific address as no longer in use.
1 2 3 4 5 |
void myFun () { char <b>pcch </b>= <b>(char*)</b> malloc (sizzeof (char)); // memory allocation // your statements free (pcch); // meory deallocation } |
How malloc and free functions works?
The malloc() function takes the integer as an argument to specify the bytes of memory to be allocated and void* as a return value. So we need to typecast it as per our requirement. The free() function accepts a pointer to the space for its argument.
Let us see the worked example to understand the malloc and free functions:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
using namespace std; #include <stdio.h> #include <stdlib.h> int _tmain (int argc, _TCHAR* argv[]) { int iMaxVal = 10; char *pcchVal = NULL; pcchVal = (char*)malloc( (iMaxVal + 1) * sizeof(char)); if(pcchVal != NULL) { for(int iIndx = 0; iIndx < iMaxVal; iIndx++) pcchVal[iIndx] = 'k'+ iIndx; pcchVal[iMaxVal] = '\0'; printf ("pcchVal=%s\n", pcchVal); free (pcchVal); return 0; } else { printf("Not enough memory\n"); return 1; } } |
The output of the above program is
1 |
pcchVal=klmnopqrst |
If the memory is not allocated using the function malloc, it returns NULL.
calloc function :
calloc allocates the requested memory and returns a pointer to it. calloc initializes allocated memory to zero., but using malloc it is not possible to set the allocated memory to zero.
• The calloc() takes two integer arguments. These are multiplied together to specify how much memory to allocate.
Syntax of the calloc function:
1 |
void *calloc(size_t nitems, size_t size) |
Here are the parameters
• nitems — This is the count of elements to be allocated.
• size — This is the size of elements.
This function returns a pointer to the allocated memory, or it returns NULL if the request fails.
calloc function with example:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
using namespace std; #include <stdio.h> #include <stdlib.h> int _tmain (int argc, _TCHAR* argv[]) { int iIndex, iCount = 0; int *iVal = NULL; printf("Please enter Number of elements do u want"); cin >> iCount; iVal = (int*)calloc(iCount, sizeof(int)); cout << "you have Entered" << iCount << "numbers" <<endl; for(iIndex=0 ; iIndex <iCount ; iIndex++ ) { cin >> iVal[iIndex]; } cout <<"The total numbers you entered are:"; for(iIndex=0 ; iIndex < iCount; iIndex++ ) { cout << iVal[iIndex] << endl; } getchar (); return(0); } |
Output is;
1 2 3 4 5 6 7 8 9 10 11 |
Please enter Number of elements do u want 4 you have Entered 4 numbers 2 3 4 5 The total numbers you entered are: 2 3 4 5 |
What is the difference between the malloc & calloc?
As discussed earlier calloc allocates the requested memory and returns a pointer to it. calloc initializes allocated memory to zero., but using malloc it is not possible to set the allocated memory to zero.
realloc function:
the memory allocated by malloc / calloc can be resized using reallco function.
Below are the few points that we need to understand about the realloc function.
• The contents of the object will remain unaltered up to the lesser of the new and old sizes.
• If the new size of the memory object would require movement of the object, the space for the previous instantiation of the object is freed.
• If the new size is larger, the contents of the newly allocated portion of the object are unspecified.
• If the size is zero and ptr isn’t a null pointer, the object pointed to is freed.
• If the space can’t be allocated, the object remains unaltered.
• If ptr is a null pointer, realloc() acts like malloc() for the specified size.
Syntax of the realloc:
1 |
void * realloc (void * ptr, size_t size) |
Return value:
realloc() returns a pointer to the new space, or NULL if the request cannot be satisfied.
Example for realloc:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
using namespace std; #include <stdio.h> #include <stdlib.h> int _tmain (int argc, _TCHAR* argv[]) { char *pcchStr = NULL; /* Initial memory allocation */ pcchStr = (char *) malloc(45); strcpy (pcchStr, "Examplerealloc"); cout << "pcchString = " << pcchStr << "Address = "<<pcchStr <<endl; /* Reallocating memory */ pcchStr = (char *) realloc(pcchStr, 50); strcat (pcchStr, "firstprogram"); cout <<"pcchString =" << pcchStr << << "\n" << Address" << pcchStr <<endl; free(pcchStr); getchar (); return 0; } |
Output is as shown below:
1 2 3 |
pcchString = Examplerealloc Address = Examplerealloc pcchString =Examplerealloc firstprogram Address Examplerealloc firstprogram |
free function:
The free function is used to free the previously allocated memory using malloc / calloc/realloc, it takes the pointer to a heap block and returns it to the free pool for later reuse
syntax of the free is
1 |
void free(void*) |
Points we need to remember about the free is:
call to free() does not need to give the size of the heap block – the heap manager will have noted the size in its private data structures.
The call to free() just needs to identify which block to deallocate by its pointer. If a program correctly deallocates all of the memory it allocates, then every call to malloc() will later be matched by exactly one call to free().