找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1027|回复: 11
打印 上一主题 下一主题
收起左侧

关于IAR编译器堆栈地址分析

[复制链接]
跳转到指定楼层
楼主
ID:458247 发表于 2023-12-14 08:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求解答:
    1、在IAR中,局部变量是在函数结束后就被释放的对吗?
    2、这个局部变量被释放后,该地址什么时候才能被再次被使用?

    我目前遇到的问题是:在一个函数里面定义一个局部数组,然后通过指针把这个数组首地址拿到。最后在上一级函数中使用。在使用前我又在该函数中创建一个局部数组,照理说这个局部数组应该被定义在前面被释放的那个地址上,实际结果确实被定义在该局部数组后面的地址中。是什么原因呢
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:883242 发表于 2023-12-14 12:17 | 只看该作者
IAR有几十种编译器,每种编译器处理方式完全不一样,你用的是哪一种?
回复

使用道具 举报

板凳
ID:830831 发表于 2023-12-14 13:12 | 只看该作者
是你求分析  而不是你来解答,话不会说?
回复

使用道具 举报

地板
ID:458247 发表于 2023-12-14 15:13 | 只看该作者
Hephaestus 发表于 2023-12-14 12:17
IAR有几十种编译器,每种编译器处理方式完全不一样,你用的是哪一种?

arm的,s32k144
回复

使用道具 举报

5#
ID:458247 发表于 2023-12-14 15:13 | 只看该作者
Highnose 发表于 2023-12-14 13:12
是你求分析  而不是你来解答,话不会说?

我有在文中解答?看不懂话可以别说话
回复

使用道具 举报

6#
ID:1101997 发表于 2023-12-14 15:18 | 只看该作者
IAR变量通常存在三种内存,静态内存就是用static声明的,一般会保存在通用ram中,还有就是堆和栈,其中堆的内存使用一般需要程序员申请的动态内存用malloc或者new操作,依赖于你使用的是C还是C++,你说的情况一般是放在栈里面,通常用于函数的局域变量,就是函数结束了就动态释放了。
回复

使用道具 举报

7#
ID:1101997 发表于 2023-12-14 15:19 | 只看该作者
局域内存变化释放了会分配给其他使用,这也是依赖于编译器,IAR是你说的这种情况,KEIL一般来说编译的时候考虑相互覆盖来出来局域变量以达到节省内存的作用。
回复

使用道具 举报

8#
ID:1101997 发表于 2023-12-14 15:23 | 只看该作者
变量使用在IAR中是挺复杂的,定义堆和栈的大小很重要,不然即使物理上有空余内存也有可能因为溢出而出错,网络上这些分析挺多的,一两句话的回答未必能描述清晰,建议系统的看一下,我一般使用新的编译器都是看它自身的HELP说明
回复

使用道具 举报

9#
ID:883242 发表于 2023-12-14 15:38 | 只看该作者
nearsea 发表于 2023-12-14 15:19
局域内存变化释放了会分配给其他使用,这也是依赖于编译器,IAR是你说的这种情况,KEIL一般来说编译的时候 ...

你还是接触的编译器太少才会说出这种一点儿正确的地方都没有的%。

三十二位单片机的编译器一般都是标准c语言,在堆栈上分配局部变量,具体方式在《数据结构》递归一节里面会有详细说明。不管是IAR EWARM还是RVMDK也就是你们说的“Keil”都是这样的。

八位机编译器一般都会静态分配局部变量地址,根据调用关系进行相互覆盖以获得RAM的最大利用。不管是IAR8051还是Keil C51都是这样的,特点是不支持标准c语言的递归操作。

对于IAR、Keil这些多平台编译器来说,不同平台编译器的处理方式完全不一样,井口的一片天并不是全天下的天空。
回复

使用道具 举报

10#
ID:883242 发表于 2023-12-14 15:49 | 只看该作者

既然你用的是IAR EWARM那么这个问题可以解答。

    1、在IAR中,局部变量是在函数结束后就被释放的对吗?

是的。

    2、这个局部变量被释放后,该地址什么时候才能被再次被使用?

当某个函数被调用,需要用到这个地址做局部变量的时候才会被使用。

至于下面的问题,你表达的实在是过于含糊,比如a()调用了b(),b()定义了str[],返回a(),然后在a()里面定义了str2[],你发现str2[]没覆盖str[],是这个意思吗?如果是,那么请问你,如何在a()里面先调用b()再定义str2[]的?这根本就不符合语法么???如果是c99标准的c语言,只是形式上可以随用随定义,但是人家本质上还是要先定义再执行。
回复

使用道具 举报

11#
ID:458247 发表于 2023-12-15 09:28 | 只看该作者
Hephaestus 发表于 2023-12-14 15:49
既然你用的是IAR EWARM那么这个问题可以解答。

    1、在IAR中,局部变量是在函数结束后就被释放的对 ...

感谢回复,“如果是c99标准的c语言,只是形式上可以随用随定义,但是人家本质上还是要先定义再执行”这句话是这个问题的最终原因。我测试的时候没理解到这一层。现在我又测试了一次,发现如果在a函数释放后,再调用一个c函数,那么值就会被覆盖了
回复

使用道具 举报

12#
ID:883242 发表于 2023-12-16 00:01 | 只看该作者
yzw846562238 发表于 2023-12-15 09:28
感谢回复,“如果是c99标准的c语言,只是形式上可以随用随定义,但是人家本质上还是要先定义再执行”这句 ...

提问题要把问题说清楚,靠别人瞎猜太累了。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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