realloc() and free() Functions in C: Memory Management

Rumman Ansari   Software Engineer   2024-07-05 04:17:46   10278  Share
Subject Syllabus DetailsSubject Details
☰ TContent
☰Fullscreen

C language inherently does not have any technique to allocate memory dynamically, there are 4 library functions under stdlib.h for dynamic memory allocation.

Function Use of Function
malloc() Allocates requested size of bytes and returns a pointer first byte of allocated space
calloc() Allocates space for an array elements, initializes to zero and then returns a pointer to memory
free() deallocate the previously allocated space
realloc() Change the size of previously allocated space

We already discuss about malloc() function in previous chapter.

We already discuss about calloc() function in previous chapter.

realloc() function

If the previously allocated memory is insufficient or more than required, you can change the previously allocated memory size using realloc().

realloc () function modifies the allocated memory size by malloc () and calloc () functions to new size.

If memory is not sufficient for malloc() or calloc(), you can reallocate the memory by realloc() function. In short, it changes the memory size.

Syntax

ptr = realloc(ptr, newsize);

Example

int *ptr;
ptr = (int*)malloc(50 * sizeof(int));
ptr = (int*)realloc(ptr,100); //allocated a new memory to variable x

free() function in C

The free( ) function returns the memory pointed to by ptr to the heap. This makes the memory available for future allocation.

The memory occupied by malloc() or calloc() functions must be released by calling free() function. Otherwise, it will consume memory until program exit.

Program; realloc() function and allocating address position

In this program, we are going to allcate some memory using calloc() function.

#include 
void free(void *ptr);
<span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;stdio.h&gt;</span><span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;stdlib.h&gt;</span><span class="pln">

</span><span class="kwd">int</span><span class="pln"> main</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">int</span><span class="pln"> </span><span class="pun">*</span><span class="pln">ptr</span><span class="pun">,</span><span class="pln"> i </span><span class="pun">,</span><span class="pln"> n1</span><span class="pun">,</span><span class="pln"> n2</span><span class="pun">;</span><span class="pln">
    printf</span><span class="pun">(</span><span class="str">"Enter size of array: "</span><span class="pun">);</span><span class="pln">
    scanf</span><span class="pun">(</span><span class="str">"%d"</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">n1</span><span class="pun">);</span><span class="pln">

    ptr </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pun">*)</span><span class="pln"> malloc</span><span class="pun">(</span><span class="pln">n1 </span><span class="pun">*</span><span class="pln"> </span><span class="kwd">sizeof</span><span class="pun">(</span><span class="kwd">int</span><span class="pun">));</span><span class="pln">

    printf</span><span class="pun">(</span><span class="str">"Address of previously allocated memory: \n"</span><span class="pun">);</span><span class="pln">
    </span><span class="kwd">for</span><span class="pun">(</span><span class="pln">i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> n1</span><span class="pun">;</span><span class="pln"> </span><span class="pun">++</span><span class="pln">i</span><span class="pun">)</span><span class="pln">
         printf</span><span class="pun">(</span><span class="str">"%u\t"</span><span class="pun">,</span><span class="pln">ptr </span><span class="pun">+</span><span class="pln"> i</span><span class="pun">);</span><span class="pln">

    printf</span><span class="pun">(</span><span class="str">"\nEnter new size of array: \n"</span><span class="pun">);</span><span class="pln">
    scanf</span><span class="pun">(</span><span class="str">"%d"</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">n2</span><span class="pun">);</span><span class="pln">
    ptr </span><span class="pun">=</span><span class="pln"> realloc</span><span class="pun">(</span><span class="pln">ptr</span><span class="pun">,</span><span class="pln"> n2</span><span class="pun">);</span><span class="pln">
    </span><span class="kwd">for</span><span class="pun">(</span><span class="pln">i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> n2</span><span class="pun">;</span><span class="pln"> </span><span class="pun">++</span><span class="pln">i</span><span class="pun">)</span><span class="pln">
         printf</span><span class="pun">(</span><span class="str">"%u\t"</span><span class="pun">,</span><span class="pln"> ptr </span><span class="pun">+</span><span class="pln"> i</span><span class="pun">);</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span>
Output
<span class="pln">
</span><span class="typ">Enter</span><span class="pln"> size </span><span class="kwd">of</span><span class="pln"> array</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5</span><span class="pln">
</span><span class="typ">Address</span><span class="pln"> </span><span class="kwd">of</span><span class="pln"> previously allocated memory</span><span class="pun">:</span><span class="pln">
</span><span class="lit">39128384</span><span class="pln">        </span><span class="lit">39128388</span><span class="pln">        </span><span class="lit">39128392</span><span class="pln">        </span><span class="lit">39128396</span><span class="pln">        </span><span class="lit">39128400</span><span class="pln">

</span><span class="typ">Enter</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> size </span><span class="kwd">of</span><span class="pln"> array</span><span class="pun">:</span><span class="pln">
</span><span class="lit">3</span><span class="pln">
</span><span class="lit">39128384</span><span class="pln">        </span><span class="lit">39128388</span><span class="pln">        </span><span class="lit">39128392</span><span class="pln"> 

</span>

Program: realloc() and free() function

In this program, we are going to allcate some memory using calloc() function.

<span class="pln">
 </span><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;stdio.h&gt;</span><span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;string.h&gt;</span><span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;stdlib.h&gt;</span><span class="pln">
 
</span><span class="kwd">int</span><span class="pln"> main</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">char</span><span class="pln"> </span><span class="pun">*</span><span class="pln">ptr</span><span class="pun">;</span><span class="pln">
    </span><span class="com">/* memory is allocated dynamically */</span><span class="pln">
    ptr </span><span class="pun">=</span><span class="pln"> malloc</span><span class="pun">(</span><span class="pln"> </span><span class="lit">20</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="kwd">sizeof</span><span class="pun">(</span><span class="kwd">char</span><span class="pun">)</span><span class="pln"> </span><span class="pun">);</span><span class="pln">
    </span><span class="kwd">if</span><span class="pun">(</span><span class="pln"> ptr </span><span class="pun">==</span><span class="pln"> NULL </span><span class="pun">)</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        printf</span><span class="pun">(</span><span class="str">"Couldn't able to allocate requested memory\n"</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    </span><span class="kwd">else</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
       strcpy</span><span class="pun">(</span><span class="pln"> ptr</span><span class="pun">,</span><span class="str">"atnyla.com"</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    printf</span><span class="pun">(</span><span class="str">"Dynamically allocated memory content  : "</span><span class="pln"> \
           </span><span class="str">"%s\n"</span><span class="pun">,</span><span class="pln"> ptr </span><span class="pun">);</span><span class="pln">
    ptr</span><span class="pun">=</span><span class="pln">realloc</span><span class="pun">(</span><span class="pln">ptr</span><span class="pun">,</span><span class="lit">100</span><span class="pun">*</span><span class="kwd">sizeof</span><span class="pun">(</span><span class="kwd">char</span><span class="pun">));</span><span class="pln">
    
    </span><span class="kwd">if</span><span class="pun">(</span><span class="pln"> ptr </span><span class="pun">==</span><span class="pln"> NULL </span><span class="pun">)</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        printf</span><span class="pun">(</span><span class="str">"Couldn't able to allocate requested memory\n"</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    </span><span class="kwd">else</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        strcpy</span><span class="pun">(</span><span class="pln"> ptr</span><span class="pun">,</span><span class="str">"space is extended upto "</span><span class="pln"> \
                               </span><span class="str">"100 characters"</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    printf</span><span class="pun">(</span><span class="str">"Resized memory : %s\n"</span><span class="pun">,</span><span class="pln"> ptr </span><span class="pun">);</span><span class="pln">
    free</span><span class="pun">(</span><span class="pln">ptr</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span>
Output
<span class="pln">
</span><span class="typ">Dynamically</span><span class="pln"> allocated memory content  </span><span class="pun">:</span><span class="pln"> atnyla</span><span class="pun">.</span><span class="pln">com
</span><span class="typ">Resized</span><span class="pln"> memory </span><span class="pun">:</span><span class="pln"> space </span><span class="kwd">is</span><span class="pln"> extended upto </span><span class="lit">100</span><span class="pln"> characters
</span><span class="typ">Press</span><span class="pln"> any key to </span><span class="kwd">continue</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="pun">.</span><span class="pln">

</span>

Program:

This program allocates room for the strings entered by the user and then frees the memory:

<span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;stdlib.h&gt;</span><span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;stdio.h&gt;</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> main</span><span class="pun">(</span><span class="kwd">void</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
</span><span class="kwd">char</span><span class="pln"> </span><span class="pun">*</span><span class="kwd">string</span><span class="pun">[</span><span class="lit">100</span><span class="pun">];</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> i</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">for</span><span class="pun">(</span><span class="pln">i</span><span class="pun">=</span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">&lt;</span><span class="lit">100</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	</span><span class="kwd">if</span><span class="pun">((</span><span class="kwd">string</span><span class="pun">[</span><span class="pln">i</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> malloc</span><span class="pun">(</span><span class="lit">128</span><span class="pun">))==</span><span class="pln">NULL</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	printf </span><span class="pun">(</span><span class="str">"Allocation Error \n"</span><span class="pun">);</span><span class="pln">
	</span><span class="kwd">exit</span><span class="pln"> </span><span class="pun">(</span><span class="lit">1</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
gets</span><span class="pun">(</span><span class="kwd">string</span><span class="pun">[</span><span class="pln">i</span><span class="pun">]);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="com">/* now free the memory */</span><span class="pln">
</span><span class="kwd">for</span><span class="pun">(</span><span class="pln">i</span><span class="pun">=</span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">&lt;</span><span class="lit">100</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln">
 free</span><span class="pun">(</span><span class="kwd">string</span><span class="pun">[</span><span class="pln">i</span><span class="pun">]);</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span>

No Questions Data Available.
No Program Data.

Stay Ahead of the Curve! Check out these trending topics and sharpen your skills.