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
#include
void *realloc(void *ptr, size_t size);
Para 3:
If
ptr
is a null pointer, therealloc
function behaves like themalloc
function for the specified size. Otherwise, ifptr does not match a pointer earlier returned by thecalloc
,malloc
,orrealloc
function, or if the space has been deallocated by a call to thefree
orrealloc
function, the behavior is undefined . If memory for the newobject cannot be allocated, the old object is not deallocated and its value is unchanged.
Note that in your case the pointer being passed to realloc
is not null ans also was not received by calling calloc
, malloc
or realloc
which breaks the requirements mandated by the standard hence the Undefined Behavior.
You can use realloc ONLY on pointers that have been returned from malloc or realloc. In other words, your program is wrong.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.