user-0 提问: 为什么我设的指针函数在调用完后，形参不释放？？？（小弟有强迫症，不弄个明白睡不着觉啊！）

回复:
user: user-1
content: 你需要先搞明白释放的含义，所谓的释放是指告诉系统指定地址空间的内存已经不再使用，可以回收后再次分配了。如果没有再次被分配出去的话那块内存里的实际数据是不会被变更的（这句话并不绝对，因为理论上那块地址空间你已经宣布不再使用了，如果你等待足够的时间或者sleep 的足够久导致你的程序被swap过的话，就有可能出现未知结果）。 其实 你只需要稍微改下代码就能体会到这个释放的具体含义了就是在 p=min(a,b);            //返回最小值的地址 int a[] = { 1,2,3,4,5,6,8,10,12,13,14,15,16 } printf("min=%d\n",*p);  //输出最小值 这时输出的值如果是64程序的话 并且 a < b 则为 3  如果 a > b 则为4 （具体的可能有偏差但一定是a数组里的某一个数，32为相同原理） 另外再说下int *minp(int *i,int *j) {   int *q;      q=*i<*j?i:j;       return (q);  //指针变量q作为指针函数的返回值 } 这种写法是不妥的因为当minp执行完毕return的时候 q已经被弹出栈了，在c语言里看不出差别，但是在C++里面就有很大的区别 因此如果 这不是int *q 而是一个类对象的话 如（string list等）会调用其析构函数，导致你最后返回的值是一个奇怪的东西，如果该类是一个具有虚函数的类的话，将其返回值付给另一个对象会导致出现一个被析构过的对象，最严重的问题就是其虚指针会被重置！

user: user-2
content: 栈中的基本变量退出其作用域时，没有谁执行一段代码去释放/销毁/析构它所占用的内存，仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。 而栈中的类变量退出其作用域时，会自动执行其析构函数，……  其实电脑开机后物理内存的每个字节都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-3
content: 先换个编译器，那个警告是不应该出现的。

user: user-4
content: 引用 2 楼 qq_24594481 的回复:谢谢你的回复。 我还有如下问题 1.每次输入，都是输出最小值！！！不会变啊。 2.其实跟申请堆上的内存是一样的   如： int* pInt = new int;   这里是想堆申请一块内存 *pInt = 3;  delete pInt;  printf("%d",*p);  这里是可以答应值的  是什么意思？（请原谅新手的无知）  那请楼主去看入门书籍了，先得知道是什么，才可以问为什么。

user: user-5
content: 指针消亡了，并不表示它所指的内存会被自动释放。同样，内存被释放了，并不表示指针会消亡或者成了 NULL 指针。

user: user-1
content: 再给你补充点只是 所谓调用函数其实跟局部变量类似，他会先在栈顶压入函数指针，然后在按照从左到右的顺序加入形参（根据编译器的不同这个顺序可能会不一样），你最后返回的那个指针其实就是指向这些形参位置的指针。在函数执行完毕后，他们会从栈里弹出来（其实就是把栈顶标记又缩回去了）这个时候如果你在声明临时变量的话，就会被分配到刚刚被调用的那个函数所使用的位置。其实程序的本质就是一个清理栈的过程，当栈被清理干净的时候程序也就运行完毕

user: user-6
content: 没释放，运气好也是不好。。。

user: user-7
content: 更一般的。参数为指针的时候，函数还可以返回指针运算的结果，只要可以确定指针运算的结果，所代表的地址，有个有效地址 例如：  int *get_index_n(int *a,int n) {            return a + n; }  //这个函数 //可以这么用  int main() {          int a[10] ={0,1,2,3,4,5,6,7,8,9}; int *p; p =get_index_n(a,5);// 没超过 10  printf("*p =%d",*p); //输出 a[5]的值，也就是 5 getchar(); return 0; }

user: user-7
content: C语言 只有一种参数传递方式，值传递 指针的值传递， 比较特殊，因为指针可以间接引用，它所指向的内存中的数据（对象） 而内存数据，和指针本身，有没有被替换无关， 只和指针所指的位置 即指针值有关系，  所以，虽然实参指针-----例如对象（变量）地址，数组名----， 和形参是两个变量对象， 这两个指针的地址所代表的指针变量占用的内存，是不同的，  但是指针的值是相同的， 二者所指向的内存是相同的 所以，可以返回(形参)指针本身。 这个函数，返回的实际是，所传递的实参指针的值。 只要这个值指向的对象（通常是变量，有时候是动态分配的无名对象）是有效的， 就可以在任何时候使用。  注意返回的不是指针的地址，而是指针的值 指针的地址是局部变量的地址 指针的值，其实也是实参指针的值（这就是值传递的含义）  只要函数调用时，传递的实参，是有效的地址。 返回形参指针的值，就不会有问题。

user: user-0
content: 谢谢你的回复。 我还有如下问题 1.每次输入，都是输出最小值！！！不会变啊。 2.其实跟申请堆上的内存是一样的   如： int* pInt = new int;   这里是想堆申请一块内存 *pInt = 3;  delete pInt;  printf("%d",*p);  这里是可以答应值的  是什么意思？（请原谅新手的无知）

user: user-4
content: 书上说：子函数调用完后，形参的内存空间释放   释放空间只是断开了一直关联的关系，内存的内容可能不变，也有可能边了。  这里你运气好，刚好没变而已  其实跟申请堆上的内存是一样的  如： int* pInt = new int;   这里是想堆申请一块内存 *pInt = 3; delete pInt; printf("%d",*p);  这里是可以答应值的  虽然delete了 但是还是能打印出值  因为，你向系统要了一块内存，然后赋值该内存，系统就知道了这块内存是你用的，别人就不能分配了，当你delete后，系统认为这块内存已经没人用了，别人也可以来申请，但如果此时没有人刚好申请这块内存，这块内存是没有变化的，所以能正常打印  但是如果有人用了，这块内存内容就不可知了...