While using realloc(), I checked it with valgrind as follows
valgrind --tool=memcheck --leak-check=yes --show-reachable=yes a.out
and the error information produced by valgrind is
==6402== Memcheck, a memory error detector.
==6402== Copyright (C) 2002-2005, and GNU GPL'd, by Julian Seward et al.
==6402== Using LibVEX rev 1575, a library for dynamic binary translation.
==6402== Copyright (C) 2004-2005, and GNU GPL'd, by OpenWorks LLP.
==6402== Using valgrind-3.1.1, a dynamic binary instrumentation framework.
==6402== Copyright (C) 2000-2005, and GNU GPL'd, by Julian Seward et al.
==6402== For more details, rerun with: -v
==6402==
dinesh
vignesh
==6402== Invalid free() / delete / delete[]
==6402== at 0x4905E12: realloc (vg_replace_malloc.c:306)
==6402== by 0x400539: main (in /user/gur29597/mysourcecode/VMake/a.out)
==6402== Address 0x7FF000830 is on thread 1's stack
vishwa
==6402==
==6402== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 4 from 1)
==6402== malloc/free: in use at exit: 0 bytes in 0 blocks.
==6402== malloc/free: 1 allocs, 1 frees, 3 bytes allocated.
==6402== For counts of detected errors, rerun with: -v
==6402== All heap blocks were freed -- no leaks are possible.
My code is as follows ,
#include<stdio.h>
int main()
{
char *name[2];
name[0]="dinesh";
name[1]="vignesh";
printf("%s\n%s\n",name[0],name[1]);
realloc(name,3);
name[2]="vishwa";
printf("%s\n",name[2]);
return 0;
}
Your program causes Undefined Behavior and valgrind correctly points it out.
Reference:
C99 Standard 7.20.3.4-1: The realloc function:
Synopsis
Para 3:
Note that in your case the pointer being passed to
reallocis not null ans also was not received by callingcalloc,mallocorreallocwhich breaks the requirements mandated by the standard hence the Undefined Behavior.