The code is as follow :
#include <stdlib.h>
int num = 3; // Static external variable
int *ptr = #
int main(void)
{
int num2 = 4; // Automatic variable
int *ptr2 = &num2;
free(ptr); //Free static variable
free(ptr2); //Free automatic variable
return 0;
}
I try to compile the above code and it works, I'm curious does the free()
function able to free both the static variable and also automatic variable? Or basically it does nothing?
Calling
free()
on a pointer not returned by memory allocating functions(malloc
,calloc
etc) causes Undefined Behavior.Your code has an Undefined Behavior, So the compiler does not need to give you any diagnostic of it and it can show any behavior, it might work, or crash, or literally do anything.
Just avoid writing code which causes an Undefined Behavior is the only solution.
You shouldn't do that.
free
is only used for memory dynamically allocated from heap bymalloc
family of functions.Memory for
num
is statically allocated in data segment and can't be released. Memory fornum2
is allocated in themain
's call stack frame and will be released as soon asmain
returns.What actually happens depend on implementation of
free
. There are usually specific data structures maintained in heap to helpmalloc
/free
track the allocated and free memory areas.free
expects these data structures to be somewhere around the place its argument points to. An when you pass it a pointer which doesn't point to amalloc
-allocated heap area, it'll consider garbage data as some useful information and do some strange things. And you're lucky if the result is just an immediate program crash.