硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3701|回复: 8
收起左侧

[有问必答] 有初始值的局部变量的存储位置

[复制链接]

16

主题

148

回帖

196

积分

初级会员

积分
196
发表于 2019-5-13 00:08:10 | 显示全部楼层 |阅读模式
最近在看堆栈相关的内容,已经理解了大部分内容,有一个问题就是局部变量存放的位置是栈区,而栈区在_main函数下是直接在加载域上创建的,初始化值为0,那么它的存放位置是什么;我有这个问题的原因是因为按照之前的理解已经初始化的全局变量值刚开始是存储在flash中的,程序运行的时候才加载到SRAM中的,那局部变量的值是谁记住它的呢?

我之前可能的错误理解就是:RW段里除了包含初始化不为0的全局变量,还包含了初始化不为0的局部变量,到时候相应的局部变量在加载到栈区,但是感觉这样理解有问题
后来在网上查找得到一个结论就是 对于局部变量 如 int a = 2; 编译器其实把这个定义拆分成了两句话,int a; a = 2; 这样就不需要记住它的初始化的值了。我目前的这个理解请问各位是否有问题
硬汉哥帮我分析一下,谢谢了
假如按照上面的理解那么已经有初始值的全局变量也可以放到ZI段中啊,反正立马就会赋值的,就不需要在flash中存储初始值了啊(当然这种理解是错的,只是在对上面的分析进行一种反推)



回复

使用道具 举报

16

主题

148

回帖

196

积分

初级会员

积分
196
 楼主| 发表于 2019-5-13 00:10:35 | 显示全部楼层
@eric2013 硬汉哥 帮我分析一下 感激不尽  找不到一个合理的解释
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107014
QQ
发表于 2019-5-13 01:57:31 | 显示全部楼层
栈空间是动态申请和释放的,它的申请释放和初值等都是在程序的执行过程中做赋值和运算。
跟zi和rw区不同。
回复

使用道具 举报

4

主题

140

回帖

152

积分

初级会员

积分
152
发表于 2019-5-13 08:32:30 | 显示全部楼层
栈上的非静态变量都是使用时赋值的,和bss段,readwrite段不一样。
回复

使用道具 举报

16

主题

148

回帖

196

积分

初级会员

积分
196
 楼主| 发表于 2019-5-13 23:29:24 | 显示全部楼层
eric2013 发表于 2019-5-13 01:57
栈空间是动态申请和释放的,它的申请释放和初值等都是在程序的执行过程中做赋值和运算。
跟zi和rw区不同。 ...

硬汉哥,谢谢解答,是不是意思即使定义的时候赋值了,也是把它分开来赋值运算的
回复

使用道具 举报

16

主题

148

回帖

196

积分

初级会员

积分
196
 楼主| 发表于 2019-5-13 23:30:31 | 显示全部楼层
zl1215 发表于 2019-5-13 08:32
栈上的非静态变量都是使用时赋值的,和bss段,readwrite段不一样。

谢谢解答,使用时赋值是不是意思即使定义的时候初始化也是分开来进行赋值的
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107014
QQ
发表于 2019-5-14 03:14:34 | 显示全部楼层
dyhfaily 发表于 2019-5-13 23:30
谢谢解答,使用时赋值是不是意思即使定义的时候初始化也是分开来进行赋值的

对。
回复

使用道具 举报

16

主题

148

回帖

196

积分

初级会员

积分
196
 楼主| 发表于 2019-5-15 14:25:05 | 显示全部楼层

硬汉哥,堆和栈算ZI段的数据嘛,在_main中要在SRAM中创建ZI区域,假如堆栈不算ZI段数据的话,那如何创建堆栈区的呢
回复

使用道具 举报

5

主题

196

回帖

211

积分

高级会员

积分
211
发表于 2019-5-15 16:30:18 | 显示全部楼层
肯定是拆开加载啦,初始值会被编译进指令编码中的立即数字段。要是特别大的数,还会被拆成额外大数加载和运算指令。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-14 09:34 , Processed in 0.239101 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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