C语言程序的存储区域 , static ,const, volatile 关键字 作用域和生命周期

C语言程序的存储区域分类:

1. 代码段(code):由各个函数产生(FLASH)

2. 只读数据段(RO data):常量(FLASH)

3. 已初始化读写数据段(RW data)

4. 未初始化读写数据段(BSS):只有声明。没有初始化的变量。

5. 堆(heap):只在程序运行时出现,一般有程序员分配和释放。free mallco、new

6. 栈 (stack):只在程序运行时出现,局部变量和函数的参数以及返回值,由编译器自动分配和释放。

二、一般mcu包含的存储空间

片内FLAH:对应硬盘,其内置的 Flash 就是使用的是 Nor Flash,因为其中一个特点是支持芯片内执行(XIPeXecute In Place),就是应用程序可以直接在 flash 闪存内运行,而不要先拷贝到 RAM 中,然后程序在 RAM 中执行。NOR 的读速度比 NAND 快一些

片内RAM:对应运行内存。

IAR编译器:

Readonly code Memory 只读代码段

Readonly data Memary 只读数据段

readwrite data Memary 读写数据段

三个之和为 烧写程序所占的FLASH存储空间。

Keil编译器

RO size = code + RO data  程序占用FLASH的空间大小

RW size = RW data(初始化为非零的全局变量) + ZI data(0数据段,存放未初始化的全局变量和初始化为0的变量)运行时占用RAM的大小

ROW size = code + RO data + RW data 烧写程序所占FLASH空间的大小。

生命周期与作用域的角度

const 关键字:作用是限定一个变量不允许被改变。

c语言中 const 全局变量存储在只读数据段,编译期最初将其保存在符号表中(const 全局有的编译器直接当立即数存在ROM
中),第一次使用时为其分配内存,在程序结束时释放。
而const局部变量(局部变量就是在函数中定义的一个const变量,) 存储在中,代码块结束时释放。
在c语言中可以通过指针对 const 局部变量进行修改,而不可以对 const 全局变量进行修改。因为 const 全局变量是存储在只读数据段。《c语言中const修饰的局部变量和全局变量存放在哪个区域》

static 关键字:(隐匿)

    1、在修饰变量的时,static修饰的静态局部变量只执行一次,而且延长了局部变量的生命周期,直到程序运行结束以后才释放。

    2、static修饰全局变量的时,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是extern外部声明也不可以。

    3、static修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用。Static修饰的局部变量存放在全局数据区的静态变量区

volitail 关键字:一个函数用了一个外部的变量,但这个变量在此函数中没有改变,只是引用,这时候编译器会去做优化,把它的值暂放在内部寄存器中,用的时候读取的是寄存器的值,而不是去访问它的地址取值,这样的话,当这个变量在外部发生了变化的时候,比如中断,或者另外的进程等等。但在这个函数里面就不能起作用,因为被优化后使用的是寄存器的值,还是原来的值,导致错误发生。这种情况下,就要加上这个定义,就不会被优化了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值