为什么小弟我设的指针函数在调用完后,形参不释放?(小弟有强迫症,不弄个明白睡不着觉啊)
为什么我设的指针函数在调用完后,形参不释放???(小弟有强迫症,不弄个明白睡不着觉啊!)
书上说:子函数调用完后,形参的内存空间释放。可是如下程序却颠覆了我原来的看法。
按理说应输出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
------解决思路----------------------
再给你补充点只是 所谓调用函数其实跟局部变量类似,他会先在栈顶压入函数指针,然后在按照从左到右的顺序加入形参(根据编译器的不同这个顺序可能会不一样),你最后返回的那个指针其实就是指向这些形参位置的指针。在函数执行完毕后,他们会从栈里弹出来(其实就是把栈顶标记又缩回去了)这个时候如果你在声明临时变量的话,就会被分配到刚刚被调用的那个函数所使用的位置。其实程序的本质就是一个清理栈的过程,当栈被清理干净的时候程序也就运行完毕
------解决思路----------------------
先换个编译器,那个警告是不应该出现的。
书上说:子函数调用完后,形参的内存空间释放。可是如下程序却颠覆了我原来的看法。
按理说应输出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
------解决思路----------------------
再给你补充点只是 所谓调用函数其实跟局部变量类似,他会先在栈顶压入函数指针,然后在按照从左到右的顺序加入形参(根据编译器的不同这个顺序可能会不一样),你最后返回的那个指针其实就是指向这些形参位置的指针。在函数执行完毕后,他们会从栈里弹出来(其实就是把栈顶标记又缩回去了)这个时候如果你在声明临时变量的话,就会被分配到刚刚被调用的那个函数所使用的位置。其实程序的本质就是一个清理栈的过程,当栈被清理干净的时候程序也就运行完毕
------解决思路----------------------
先换个编译器,那个警告是不应该出现的。