OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4022|回复: 4

函数嵌套,内存占用问题?

[复制链接]

36

主题

195

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2014-10-27
在线时间
34 小时
发表于 2015-6-19 11:49:01 | 显示全部楼层 |阅读模式
5金钱

昨天一个局部变量未赋初值,搞出一堆问题。现在有个疑问,关于函数嵌套中内存问题,想请教一下大家:

情况1:
f(1)   //函数1
{
    u16 a;  //未赋初值
    f(2)  //嵌套函数2
   {...}
}
函数2会占用函数1中a的内存值吗?

情况2:
f(1)   //函数1
{
     u16 a=0;   //赋初值
     f(2)  //嵌套函数2
    {...}
}
为什么函数2不会占用函数1中a的内存值?

上面是关于函数嵌套的,我听说(自己不确定)当执行函数2的时候,情况1中:函数2可能会分配到函数1中a所占的内存,从而改变a的值;但是情况2中:函数2就不会占用a 内存,是这样吗,向大家求证下,谢谢!

最佳答案

查看完整内容[请看2#楼]

根据你的问题写了个类似的程序,对局部变量在后续做了些操作,优化等级为低,以确保不被优化掉。 情况1: 如下图,在运行到函数f1时,a不初始化,a的地址为0x20002FD0,这个地址在栈内,是运行到这个函数的时候在栈上分配的,因为a不初始化,所以值是随机的,如果直接使用会出错,蓝色框内的就是a的值和地址。 如下图,继续运行调用函数f2时,局部变量b的值也会分配到栈上,地址为0x20002FC0,见红框,而函数f1中的a虽然没有 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2015-6-19 11:49:02 | 显示全部楼层
根据你的问题写了个类似的程序,对局部变量在后续做了些操作,优化等级为低,以确保不被优化掉。
情况1:
如下图,在运行到函数f1时,a不初始化,a的地址为0x20002FD0,这个地址在栈内,是运行到这个函数的时候在栈上分配的,因为a不初始化,所以值是随机的,如果直接使用会出错,蓝色框内的就是a的值和地址。



如下图,继续运行调用函数f2时,局部变量b的值也会分配到栈上,地址为0x20002FC0,见红框,而函数f1中的a虽然没有赋初值,但还保留原来的栈空间,见蓝框。



情况2:与情况1相同,不过这次a赋了初值,继续运行f2也可以发现a的栈没有f2占用。如下两个图



机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2015-6-19 14:10:54 | 显示全部楼层
假设你的a在后面使用过,这样a不会被优化掉
情况1:a会被压入栈中,函数2不会占用函数1的内存值
情况2:和情况1是一样的
函数内的局部变量可能会在寄存器或栈上分配,如果不赋初值,分配地址上的值是乱的,所以局部变量赋初值是好习惯
看下原子哥的帖子会比较清楚
http://www.openedv.com/posts/list/24152.htm
机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复

使用道具 举报

36

主题

195

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2014-10-27
在线时间
34 小时
 楼主| 发表于 2015-6-19 14:59:07 | 显示全部楼层
回复【2楼】ianhom:
---------------------------------
谢谢你的解答,我去学习一下原子哥的帖子。
回复

使用道具 举报

36

主题

195

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2014-10-27
在线时间
34 小时
 楼主| 发表于 2015-6-19 16:21:30 | 显示全部楼层
回复【4楼】ianhom:
---------------------------------
谢谢你的耐心解答,你的实验很漂亮,给你点个赞!
今天上午我请教 一个武大教授,他和我说函数嵌套容易引起占用,赋初值不会,可能我自己没理解透彻,找机会我问问清楚,到时候再和你讨论。
提前下班回家了,还得去赶长途车,88,再次感谢你的耐心实验!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 05:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表