局部变量空间,就是堆栈空间,也就是栈空间。

从局部变量声明的时候,它就在堆栈空间了,而不是调用函数的时候,才让它入栈的。

定义一个局部变量a,编译器会将a的地址分配到寄存器组R0~R7中去。由于它是局部变量,所以编译器将使用立即数赋值语句为代表a的寄存器Rn赋值,最后计算的结果也将存在寄存器组中,位置由编译器任意指定。

定义一个全局变量a,编译器将在RAM中为变量a指定一个专用地址,在C程序中给a赋的值将存入这个专用地址中。程序操作变量a时,首先从专用地址中取出存放的值,然后再进行计算。

结论:

局部变量由于用寄存器直接操作,存取速度和计算速度都很快;由于寄存器数量有限,如果局部变量过多,将使代码由于频繁分配寄存器而变得冗长。

全局变量被定义在内存中的专门地址上,存取位置固定。对于频繁存取的重要变量可以采用全局变量以减少代码的长度;由于全局变量总是占用内存,如果过多,或者把程序处理和计算中的一些中间变量也定义成全局变量,将大量消耗内存空间,处理速度会减慢,同时数据安全性也会降低。

接触过编程的人都知道,高级语言都能通过变量名来访问内存中的数据。那么这些变量在内存中是如何存放的呢?程序又是如何使用这些变量的呢?下面就会对此进行深入的讨论。下文中的C语言代码如没有特别声明,默认都使用VC编译的release版。

首先,来了解一下 C 语言的变量是如何在内存分部的。C 语言有全局变量(Global)、本地变量(Local),静态变量(Static)、寄存器变量(Regeister)。每种变量都有不同的分配方式。先来看下面这段代码:

include

int g1=0, g2=0, g3=0;

int main()

{

static int s1=0, s2=0, s3=0;

int v1=0, v2=0, v3=0;

//打印出各个变量的内存地址

printf(“0xx\n”,&v1); //打印各本地变量的内存地址

printf(“0xx\n”,&v2);

printf(“0xx\n\n”,&v3);

printf(“0xx\n”,&g1); //打印各全局变量的内存地址

printf(“0xx\n”,&g2);

printf(“0xx\n\n”,&g3);

printf(“0xx\n”,&s1); //打印各静态变量的内存地址

printf(“0xx\n”,&s2);

printf(“0xx\n\n”,&s3);

return 0;

}

编译后的执行结果是:

0x0012ff78

0x0012ff7c

0x0012ff80

0x004068d0

0x004068d4

0x004068d8

0x004068dc

0x004068e0

0x004068e4

输 出的结果就是变量的内存地址。其中v1,v2,v3是本地变量,g1,g2,g3是全局变量,s1,s2,s3是静态变量。你可以看到这些变量在内存是连 续分布的,但是本地变量和全局变量分配的内存地址差了十万八千里,而全局变量和静态变量分配的内存是连续的。这是因为本地变量和全局/静态变量是分配在不 同类型的内存区域中的结果。对于一个进程的内存空间而言,可以在逻辑上分成3个部份:代码区,静态数据区和动态数据区。动态数据区一般就是“堆栈”。“栈 (stack)”和“堆(heap)”是两种不同的动态数据区,栈是一种线性结构,堆是一种链式结构。进程的每个线程都有私有的“栈”,所以每个线程虽然 代码一样,但本地变量的数据都是互不干扰。一个堆栈可以通过“基地址”和“栈顶”地址来描述。全局变量和静态变量分配在静态数据区,本地变量分配在动态数 据区,即堆栈中。程序通过堆栈的基地址和偏移量来访问本地变量。

补充:怎么让程序的全局变量不会漫天飞

1.使用结构体分类
2.把全局变量放在一个.c里面
3.如果外部函数要调用的话,就使用相应API(如cmSet_xxxxx() cmGet_xxxxx())

单片机全局变量 局部变量 堆与栈相关推荐

  1. stm32 堆和栈(stm32 Heap Stack)

    关于堆和栈已经是程序员的一个月经话题,大部分有是基于os层来聊的. 那么,在赤裸裸的单片机下的堆和栈是什么样的分布呢?以下是网摘: 刚接手STM32时,你只编写一个 int main() { whil ...

  2. stm32 堆和栈(stm32 Heap Stack)【worldsing笔记】

    关于堆和栈已经是程序员的一个月经话题,大部分有是基于os层来聊的. 那么,在赤裸裸的单片机下的堆和栈是什么样的分布呢?以下是网摘: 刚接手STM32时,你只编写一个 int main() { whil ...

  3. C++__堆,栈与内存管理

    C++__堆,栈与内存管理 1.什么是栈,什么是堆 具体可以看这篇:转载[C]堆区和栈区的区别 2.静态变量,全局变量,堆,栈生命周期 3.new与delete的动作 4.动态分配的内存计算 参考:& ...

  4. C/C++ 全局变量和局部变量在内存里的区别?堆和栈

    一.预备知识-程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分  1.栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈 ...

  5. C语言程序里全局变量、局部变量、堆、栈内存地址分配

    C语言程序里全局变量.局部变量.堆.栈内存地址分配 1 名词解读 2 基于ubuntu编程,调试验证 2.1 编写文件 2.2 结果分析 3 基于stm32编程,调试验证 3.1 编写代码 3.2 运 ...

  6. 基于Ubuntu和STM32分析全局变量、局部变量、堆、栈

    目录 一.C程序的内存分配 二.STM32的内存分布 三.Ubuntu系统和STM32中验证 1.Ubuntu ​ 2.STM32 四.参考资料 一.C程序的内存分配 栈(stack) 由编译器自动分 ...

  7. 单片机中堆和栈的区别

    M0中的栈和堆 一.栈和堆空间的区别: (1)栈区(stack):由编译器自动分配和释放,存放函数的参数值.局部变量的值等,其操作方式类似于数据结构中的栈. (2)堆区(heap):一般由程序员分配和 ...

  8. 局部变量、全局变量、堆、堆栈、静态和全局

    一般全局变量存放在数据区,局部变量存放在栈区, 动态变量存放在堆区,函数代码放在代码区. ------------------------------------------------------- ...

  9. 程序的内存分配之堆和栈的区别

    堆栈概述   在计算机领域,堆栈是一个不容忽视的概念,堆栈是两种数据结构.堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除.在单片机应用中,堆栈是个特殊的存 ...

  10. Ubuntu、stm32下的C程序中堆、栈、全局、局部等变量的重温

    一.C程序的内存分配 1.栈区(stack) 由编译器自动分配释放,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 2.堆区(heap) 一般由程序员分配释放,若程序员不释放,程序 ...

最新文章

  1. 求真不二,春风细雨:AI界追忆黄煦涛教授的为学、为师、为人
  2. ON REG EXPRESSION.SYNTAX
  3. 皮一皮:21世纪了还有这样的事情?
  4. 成功解决label_error >= 0 label_error < static_cast<int>(nclass) MultiClassEvaluation: label must be i
  5. python virtualenv conda_在vscode中启动conda虚拟环境的思路详解
  6. 利用IIS建立高安全性Web服务器
  7. “李国庆午餐1小时”12.94万成交!同时对家暴非常自责
  8. 机器学习读书笔记(一)k-近邻算法
  9. 嵌入式c语言教程 题库 百度云,嵌入式c语言视频教程尚观主讲视频教程
  10. 手机输入法带拼音声调_分享4种给拼音加声调的方法,让你的word更有灵魂
  11. 配置zigbee模块
  12. OpenGL核心技术之法线贴图
  13. Docker与本地网络连接配置
  14. 初试-基于神经网络的植物识别
  15. Verilog HDL 快速入门
  16. Spring Data JPA 2. HelloWorld
  17. 陕师大计算机期末考试题,陕师大物理化学(上)历年期末考试题
  18. 如何制定自己的人生计划
  19. Android权限大全 (android.permission)
  20. iOS6和iOS7环境下微信登录未显示问题微信IOS的SDK:isWXAppInstalled总是返回NO和nil...

热门文章

  1. Java 求接近黄金分割数的鲁卡斯队列分子分母
  2. 非主流照片的PS教程!
  3. 揭秘全美第一黑客组织Anonymous(匿名者)的装备库
  4. Jsoup实现网络爬虫抓取数据
  5. 群晖Docker容器“failed to initialize logging driver“解决办法
  6. SD-WAN的驱动者:云计算
  7. vue 中 keep-alive,activated,deactivated
  8. JavaScript 每日一题 #8
  9. SpringBoot 读取 jar 包中 BOOT-INF/lib 下的 jar包
  10. 思科2960交换机 - 配置命令大全