Understanding memory reallocation with realloc
Let’s better understand how memory is allocated, then reallocated on the heap. When we allocate blocks of memory they are stacked on top of the heap with increasing memory addresses. What happens when we reallocate a memory block to make it larger when it’s isn’t the last item on the heap?
Table of Contents
Heap Example
Let’s create an example using malloc(3) and realloc(3p) that gives good insight. Here is how our example will play out:
- Start with an empty heap
- Allocate
memblock1
of 64-bytes as the first memory on the heap - Allocate
memblock2
of 64-bytes which goes on top ofmemblock1
- Re-Allocate
memblock1
making is 128-bytes (64-bytes larger) which will free its original location and create a new memory location on top ofmemblock2
- Allocate
memblock3
of 64-bytes which will take the block thatmemblock1
originally occupied at the beginning of the heap
Here is an animation representing the steps above.
Code Example
From the steps we have above we can write some c code to confirm our understanding using the assert(3) statements.
#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char *memblock1, *memblock2, *memblock3;
const char *fmt = "memblock1=%p, memblock2=%p, memblock1_orig=%p\n";
int
main(int argc, char *argv[])
{
char *memblock1_orig;
memblock1 = malloc(64);
memblock2 = malloc(64);
memset(memblock1, 1, 64);
memset(memblock2, 2, 64);
memblock1_orig = memblock1;
memblock1 = realloc(memblock1, 128);
assert(memblock1 != memblock1_orig);
printf(fmt, memblock1, memblock2, memblock1_orig);
for(int i=0;i<64;i++)
{
assert(memblock1[i] == 1);
assert(memblock2[i] == 2);
}
memblock3 = malloc(64);
assert(memblock3 == memblock1_orig);
printf("memblock3=%p", memblock3);
return 0;
}
Running this program on my Linode machine with an Arch Linux operating system will print the following.
$ ./realloc
memblock1=0x5868995d7340, memblock2=0x5868995d72f0, memblock1_orig=0x5868995d72a0
memblock3=0x5868995d72a0
Note, that none of the assert
statements will evaluate to false.
Details of realloc
The realloc(3p) function will do more than allocation of memory. If necessary realloc
will free the previously allocated memory from the heap and allocate memory in another place on the heap. The realloc
function will also copy the contents of the previous allocated memory for us. From the program above we assert that our values of 1
are copied to the new block verifying this is the case.