
- C Library - Home
- C Library - <assert.h>
- C Library - <complex.h>
- C Library - <ctype.h>
- C Library - <errno.h>
- C Library - <fenv.h>
- C Library - <float.h>
- C Library - <inttypes.h>
- C Library - <iso646.h>
- C Library - <limits.h>
- C Library - <locale.h>
- C Library - <math.h>
- C Library - <setjmp.h>
- C Library - <signal.h>
- C Library - <stdalign.h>
- C Library - <stdarg.h>
- C Library - <stdbool.h>
- C Library - <stddef.h>
- C Library - <stdio.h>
- C Library - <stdlib.h>
- C Library - <string.h>
- C Library - <tgmath.h>
- C Library - <time.h>
- C Library - <wctype.h>
- C Programming Resources
- C Programming - Tutorial
- C - Useful Resources
C library - realloc() function
The C stdlib library realloc() function is used to reallocate the size of dynamically allocated memory. It allows us to allocates or reserves a new memory block after deallocating the previously allocated memory.
The function realloc() is used for optimizing the memory uses. If we find that allocated memory is too large or too small. We can use the realloc() to adjust the size of the allocated memory.
This function will only work when the memory has been dynamically allocated before using realloc() function.
Syntax
Following is the C library syntax of the realloc() function −
void *realloc(void *ptr, size_t size)
Parameters
This function accepts following parameter −
-
ptr − It represents a pointer to a memory block to be reallocated. That is previously allocated by the 'malloc()', 'calloc()', and 'realloc()'.
-
size − It represents the new size for the memory block, in bytes. If the size is zero, pointer is not null. A new minimum sized object is allocated, original object will freed.
Return Value
This function returns a pointer to the newly allocated memory. Otherwise 'NULL' if the function fails to allocate the requested block of memory.
Example 1
In this example, we use the realloc() function without dynamically allocated the memory.
#include <stdio.h> #include <stdlib.h> int main() { // initialize an array of size 10 int arr[10]; // store the array to pointer int *ptr = arr; // new pointer for reallocating int *new_ptr; arr[0] = 5; arr[1] = 10; // use the new pointer new_ptr = (int *)realloc(ptr, sizeof(int)*5); *(new_ptr + 2) = 30; int i; for(i = 0; i < 5; i++){ printf("%d ", *(new_ptr + i)); } // use getchar to get the charcter // if memory is allocated getchar(); return 0; }
Output
Following is the output, when we use realloc() without dynamically allocated memory.
warning: 'realloc' called on unallocated object 'arr' [-Wfree-nonheap-object] new_ptr = (int *)realloc(ptr, sizeof(int)*5); ^~~~~~~~~~~~~~~~~~~~~~~~~ note: declared here int arr[10]; Segmentation fault
Example 2
The below example uses realloc() to increase the size of the memory block.
#include <stdio.h> #include <stdlib.h> int main() { // Initially allocate memory for 2 integers int *ptr = malloc(2 * sizeof(int)); if (ptr == NULL) { fprintf(stderr, "Memory allocation failed\n"); return 1; } ptr[0] = 5; ptr[1] = 10; // increase the size of the integer int *ptr_new = realloc(ptr, 3 * sizeof(int)); if (ptr_new == NULL) { fprintf(stderr, "Memory reallocation failed\n"); free(ptr); return 1; } ptr_new[2] = 15; int i; // Display the array for (i = 0; i < 3; i++) { printf("%d ", ptr_new[i]); } free(ptr_new); return 0; }
Output
Following is the output −
5 10 15
Example 3
Let's create another example, we dynamically stores the array element to the pointer after that we increase the size of array by 7.
#include <stdio.h> #include <stdlib.h> int main() { int *ptr, i; printf("Initial size of the array is 4\n"); // Allocate memory for 4 integers ptr = (int*)calloc(4, sizeof(int)); if(ptr == NULL) { printf("Memory allocation failed"); exit(1); } // initial array int initialArray[4] = {1, 2, 3, 4}; // Copy array into ptr for(i = 0; i < 4; i++) { ptr[i] = initialArray[i]; } printf("Increasing the size of the array by 3 elements ...\n"); // Increase the size of the array to 7 elements // use realloc ptr = (int*)realloc(ptr, 7 * sizeof(int)); if(ptr == NULL) { printf("Memory allocation failed"); exit(1); } // additional elements int additionalElements[3] = {5, 6, 7}; // Copy additional elements into ptr for(i = 4; i < 7; i++) { ptr[i] = additionalElements[i - 4]; } printf("Final array: \n"); // display the final array for(i = 0; i < 7; i++) { printf("%d ", *(ptr+i)); } free(ptr); return 0; }
Output
Following is the output −
Initial size of the array is 4 Increasing the size of the array by 3 elements ... Final array: 1 2 3 4 5 6 7