Search code examples
cpointersmemory-managementrealloc

Use of "calloc" & "realloc"


Practice

#include <stdio.h>
#include <stdlib.h>

int main(void){

  int i=0,z=2;
  char *p=(char *)calloc(z,(sizeof(char)));

  if(!(p)){
    printf("\nMemory NOT Enough\n");
    goto END;
  }

  *p='V';
  z+=2;
  p=realloc(p,z*(sizeof(char)));         ----A

  *(p+3)='S';

  for(i=0;i<z;++i)
    printf("\n%d\n",p[i]);

  END:free(p);p=NULL;

  return 0;
}


As you can see, the line marked by A uses realloc.

In line A the p on the LHS of the = is assigned the new address generated by realloc(p,z*(sizeof(char)));.

My question is :

What happens to the previously stored address in p? Previously stored address is replaced, so does it lead to memory leak?


Solution

  • If the return value from realloc() is not NULL all is well; if realloc() returns NULL you have a memory leak.

    You need to use a helper variable to use realloc() safely.

    char *tmp;
    
    tmp = realloc(p, z);
    if (tmp == NULL) {
        fprintf(stderr, "Unable to realloc.\n");
        // p still points to the old memory and its contents are valid
        exit(EXIT_FAILURE); // or some other error recovery
    } else {
        // tmp points to a (possibly new) block of memory with the same contents
        // as what p used to point to (to the maximum of the old size and z)
        // p (very probably) points to an invalid address
        p = tmp; // now p points to a valid address (also tmp)
        // ignore tmp for now on
    }