C语言变量存储类型

 

目录

 

学习途径

        C语言中变量定义方式

        Linux操作系统的进程结构/内存空间管理

        C语言变量存储类型

总结


 


提示:以下是本篇文章正文内容,下面案例可供参考

 

学习途径

        C语言中变量定义方式

存储类型 + 特征修饰 + 数据类型 + 变量名

eg. static volatile int a;
    1. 存储类型 -> 决定变量的存储位置
    2. 特征修饰 -> 决定变量的特征属性
    3. 数据类型 -> 决定变量的存储空间及数据范围
    4. 变量名字 -> 决定变量的引用标识

        Linux操作系统的进程结构/内存空间管理

将一个可执行文件加载到内存去运行将变成一个或多个进程;一个进程就是一个运行中的程序段;操作系统会为内个进程提供一个独立的4G(32bit操作系统虚拟内存空间大小:2的32次方 = 4G)的虚拟内存空间,其中1G的内核空间和3G的用户口空间。

d72ccb59928c46d48c99f0a5c026049b.png

 

        C语言变量存储类型

 58b8bd7d16cd49a994426d82d5b129aa.png

 

总结

C语言中的存储类型通过auto,static,extern,register关键字修饰其变量能决定其变量在内存中的空间分配。

 

附加图:SRAM中变量空间分布

9b38adce7d7443278258e7a5ebf22185.png

 

1.堆和栈大小

定义大小在startup_stm32f2xx.s

Stack_Size  EQU  0x00000400

AREA  STACK, NOINIT, READWRITE, ALIGN=3 
Stack_Mem  SPACE  Stack_Size 
__initial_sp

; Heap Configuration 
;  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> 
;

Heap_Size  EQU  0x00000200

AREA  HEAP, NOINIT, READWRITE, ALIGN=3 
__heap_base

2.堆和栈位置

通过MAP文件可知

HEAP  0x200106f8  Section  512  startup_stm32f2xx.o(HEAP) 
STACK  0x200108f8  Section  1024  startup_stm32f2xx.o(STACK)

__heap_base  0x200106f8  Data  0  startup_stm32f2xx.o(HEAP) 
__heap_limit  0x200108f8  Data  0  startup_stm32f2xx.o(HEAP) 
__initial_sp  0x20010cf8  Data  0  startup_stm32f2xx.o(STACK)

显然 Cortex-m3资料可知:__initial_sp是堆栈指针,它就是FLASH的0x8000000地址前面4个字节(它根据堆栈大小,由编译器自动生成)

3.堆和栈空间分配

栈:向低地址扩展

堆:向高地址扩展

显然如果依次定义变量

先定义的栈变量的内存地址比后定义的栈变量的内存地址要大

先定义的堆变量的内存地址比后定义的堆变量的内存地址要小

4.堆和栈变量

栈:临时变量,退出该作用域就会自动释放

堆:malloc变量,通过free函数释放

另外:堆栈溢出,编译不会提示,需要注意

 

------------------------------------------------------------------------------------------------------

 

如果使用了HEAP,则必须设置HEAP大小。 
如果是STACK,可以设置为0,不影响程序运行。 
IAR STM8定义STACK,是预先在RAM尾端分配一个字节的区域作为堆栈预留区域。 
当程序静态变量,全局变量,或者堆与预留堆栈区域有冲突,编译器连接的时候就会报错。 
你可以吧STACK设置为0,并不影响运行。(会影响调试,调试会报堆栈溢出警告)。 
其实没必要这么做。 
一般程序,(在允许范围内)设置多少STACK,并不影响程序真实使用的RAM大小, 
(可以试验,把STACK设置多少,编译出来的HEX文件都是一样), 
程序还是按照它原本的状态使用RAM,把STACK设置为0,并不是真实地减少RAM使用。 
仅仅是欺骗一下编译器,让程序表面上看起来少用了RAM。 
而设置一定size的STACK,也并不是真的就多使用了RAM,只是让编译器帮你 
检查一下,是否能够保证有size大小的RAM没有被占用,可以用来作为堆栈。 
以上仅针对IAR STM8.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值