Memory Reallocation Made Easy
When working with dynamic memory allocation, it’s essential to have a solid understanding of the realloc()
function. This powerful tool allows you to resize memory blocks that were previously allocated using malloc()
, calloc()
, or realloc()
itself.
The realloc() Function Prototype
Defined in the <cstdlib>
header file, the realloc()
function takes two parameters: ptr
and new_size
. ptr
points to the memory block to be reallocated, while new_size
represents the new size of the memory block in bytes.
How realloc() Works
When realloc()
is called, it attempts to resize the memory block pointed to by ptr
to the new size specified by new_size
. If the new size is zero, the behavior depends on the implementation of the library; it may or may not return a null pointer.
Return Values
The realloc()
function returns one of two values:
- A pointer to the beginning of the reallocated memory block
- A null pointer if allocation fails
Reallocating Memory: Two Possible Ways
There are two possible scenarios when reallocating memory:
Expanding or Contracting the Same Block
In this scenario, the memory block pointed to by ptr
is expanded or contracted if possible. The contents of the memory block remain unchanged up to the lesser of the new and old sizes. If the area is expanded, the contents of the newly allocated block are undefined.
Moving to a New Location
A new memory block of size new_size
bytes is allocated. Again, the contents of the memory block remain unchanged up to the lesser of the new and old sizes, and if the memory is expanded, the contents of the newly allocated block are undefined.
Example 1: realloc() in Action
When you run the program, the output will be:
Example 2: realloc() with new_size Zero
When you run the program, the output will be:
Example 3: realloc() with ptr NULL
When you run the program, the output will be:
By understanding how realloc()
works, you can efficiently manage dynamic memory allocation in your programs. Remember to always handle null pointers and allocation failures to avoid memory leaks and crashes.