为什么小弟我设的指针函数在调用完后,形参不释放?(小弟有强迫症,不弄个明白睡不着觉啊)

为什么我设的指针函数在调用完后,形参不释放???(小弟有强迫症,不弄个明白睡不着觉啊!)
书上说:子函数调用完后,形参的内存空间释放。可是如下程序却颠覆了我原来的看法。
按理说应输出min=...(乱七八糟的数),可是却不是。为什么????为什么小弟我设的指针函数在调用完后,形参不释放?(小弟有强迫症,不弄个明白睡不着觉啊)
#include <stdio.h>
int main()

   int  a,b,*p;
   int *min(int x,int y);  //函数声明
   int *minp(int *i,int *j); //函数声明
   printf("input two ints:");
   scanf("%d%d",&a,&b);
   p=min(a,b);            //返回最小值的地址
   printf("min=%d\n",*p);  //输出最小值
   p=minp(&a,&b);          //注意minp的形参类型,返回最小值的指针
   printf("minp=%d\n",*p);   //输出最小值
   return 0;
}

int *min(int x,int y)
{
    if(x<y)   return(&x); //x的地址作为指针函数的返回值 
      else  return(&y);
}

int *minp(int *i,int *j)
{   int *q; 
    q=*i<*j?i:j;
      return (q); 
//指针变量q作为指针函数的返回值
}
结果:
如: input two ints:23 45
         min=23
         minp=23
         press any keys to continue_
有警告:C:\Users\asus-zhou\Desktop\新建文件夹\指针函数与其他函数数据处理和传出的区别.c(19) : warning C4172: returning address of local variable or temporary
C:\Users\asus-zhou\Desktop\新建文件夹\指针函数与其他函数数据处理和传出的区别.c(20) : warning C4172: returning address of local variable or temporary
------解决思路----------------------
再给你补充点只是 所谓调用函数其实跟局部变量类似,他会先在栈顶压入函数指针,然后在按照从左到右的顺序加入形参(根据编译器的不同这个顺序可能会不一样),你最后返回的那个指针其实就是指向这些形参位置的指针。在函数执行完毕后,他们会从栈里弹出来(其实就是把栈顶标记又缩回去了)这个时候如果你在声明临时变量的话,就会被分配到刚刚被调用的那个函数所使用的位置。其实程序的本质就是一个清理栈的过程,当栈被清理干净的时候程序也就运行完毕
------解决思路----------------------
先换个编译器,那个警告是不应该出现的。