初学者关于c语言中函数局部变量空间释放的理解
来源:互联网 发布:神笔获取宝贝数据失败 编辑:程序博客网 时间:2024/06/07 06:11
比如下面一段代码:
#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语言)将实参的结果入栈,而被调用的函数的形参,用的就是实参的空间,当被调用的函数运行结束后,局部变量的空间被“释放”的本质,其实是栈顶的指针,移动到了调用前函数的现场信息的地方,所以刚才被调用的函数的局部变量,实际上它的值还是存放在内存中,并且在当前栈顶指针的上面的连续空间中。
这样就可以解释为什么刚才的程序中为什么不会出现错误,也不会出现非法内存访问的情况。
但是,这样做是很危险的,比如调用一个函数之后,又进行了函数的调用,则另一个函数的局部变量等信息,也会从堆栈中当前函数现场信息的位置向上累加,会覆盖第一次调用的局部变量所占有的空间。
2 0
- 初学者关于c语言中函数局部变量空间释放的理解
- 关于c语言中自动变量(局部自动变量)的空间的分配的问题
- C语言中关于函数的局部变量和地址返回
- c语言中关于局部变量的返回值
- C语言中函数返回局部变量的方法
- C语言函数中局部变量的返回
- C语言局部变量地址空间
- C语言中free函数如何确定释放的空间大小
- C语言初学--对全局变量和局部变量的理解
- 关于C语言中返回局部变量和局部指针变量
- 关于C语言中返回局部变量和局部指针变量
- c语言中函数返回局部变量的指针(一些容易犯错的地方)
- C/C++中关于函数调用结束后变量释放的问题
- 关于C语言中的局部变量和全局变量的分析
- C语言中定义变量的技巧(全局变量、局部变量、静态全局变量、静态局部变量)
- C语言中函数的思考(可以返回局部变量吗)
- C语言 局部变量存储空间的分配和释放 奇怪现象及猜想
- C语言的那些秘密之---函数返回局部变量
- 解决“只能通过Chrome网上应用商店安装该程序”的方法
- PAT1004. 成绩排名 (20)
- 集合框架-HashMap集合的案例
- Java村旅游圣地(三)---浅谈设计模式之行为型模式
- struts2中的constant配置详解
- 初学者关于c语言中函数局部变量空间释放的理解
- 对于输出的字符串进行反向输出(不包括汉字)
- 557. Reverse Words in a String III
- U盘只剩下一个快捷方式,解决办法
- LintCode 58 四个数之和
- hibernate系列(2)之getHibernateTemplate()
- UVALive 7303Aquarium 最小生成树
- servlet context cache 综合
- Minimum’s Revenge