初学者关于c语言中函数局部变量空间释放的理解
初学者关于c语言中函数局部变量空间释放的理解
比如下面一段代码:
#include <stdio.h>int* fun();int* fun(){int a;a = 1;return &a;
}int main(){int *p = NULL;p = fun();*p = 2;printf("%d\n", *p);return 0;
}
理论上来说,a是fun()函数的局部变量,而局部变量的内存空间应该在该函数运行结束后即释放掉,也就是说a变量的空间应该在fun()函数运行结束后即释放掉,所以在主函数用用p来接收a的首地址是没有意义的,因为p将指向了一个已经被释放掉了的空间,将会出现非法内存访问,但运行结果却如下:
没有错误,也没有警告。
这个问题在初学c语言的时间困惑了我很长的时间,直到我学习了数据结构,学到系统堆栈那一部分才得到了解答。
函数调用过程中,一个函数在调用另外一个函数的时候,会先将调用前的现场信息保存在系统堆栈中,然后按照从又向左的顺序(c语言)将实参的结果入栈,而被调用的函数的形参,用的就是实参的空间,当被调用的函数运行结束后,局部变量的空间被“释放”的本质,其实是栈顶的指针,移动到了调用前函数的现场信息的地方,所以刚才被调用的函数的局部变量,实际上它的值还是存放在内存中,并且在当前栈顶指针的上面的连续空间中。
这样就可以解释为什么刚才的程序中为什么不会出现错误,也不会出现非法内存访问的情况。
但是,这样做是很危险的,比如调用一个函数之后,又进行了函数的调用,则另一个函数的局部变量等信息,也会从堆栈中当前函数现场信息的位置向上累加,会覆盖第一次调用的局部变量所占有的空间。
最新文章
- 对网络公害“流氓软件”亟须综合治理(图)
- PB中执行动态SQL语句(温故知新)
- 位图(BMP)文件头格式及数据分析
- linux install jkd
- 数据库主键到底是用自增长(INT)好还是UUID好?
- 心血漏洞第二发?SSL v3再曝新漏洞发布预警
- API测试方案
- SQL Compare数据库比较工具 完全破解+使用教程
- java线性规划计算最优解算法
- Spring
- 【数字图像处理】图像的数学变换之傅里叶变换
- Linux服务器安装杀毒软件ClamAV
- 关于iPad程序如何强制横屏
- janus videoroom之媒体录制
- 【tensorflow学习】Ftrl学习
- 迷宫 (二)
- 机器学习(三):基于线性回归对波士顿房价预测