I'm not surprised - you are returning a pointer to memory you have already freed:
free(a1);
return a1;
Then, you try to free it again!
Bad idea - never, ever return a pointer to anything unless you allocated it, and haven't freed it. That includes things like this:
int* GetBadPointer(void)
{
int i = 76;
return &i;
}
It will always blow up in your face at some point, normally when you don't expect it, unless you are very careful with your pointers!