【摘要】 关于程序变量和内存分配,都是需要我们时刻关注的问题。我相信有不少人在这块犯过很多的错误,也可能说明我们基础不够扎实,编写程序的习惯也不够好。 总结一下关于程序的变量和内存方面的概念,虽然是属于C语言方面非常基础的知识,但是工作中一不小心还是会发生一些内存泄漏、内存溢出之类的问题。所以自己对这块的理解也还远远不够。在这总结一下关于这方面的知识点,用来互相学习,更用来提醒自己,并作为自己的一个经验总结。

总结一下关于程序的变量,和内存方面的概念,虽然是属于C语言方面非常基础的知识,但是工作中一不小心还是会发生一些内存泄漏、内存溢出之类的问题。所以自己对这块的理解也还远远不够。在这总结一下关于这方面的知识点,用来互相学习,更用来提醒自己,并作为自己的一个经验总结。

我们知道我们的程序一般是储存在flash里面的,但是运行的时候是在内存(RAM)里运行的,我们的程序一般有这么几个部分组成:宏定义、变量、常量、动态区、程序代码。

我们通过下面这个Demo程序来了解一下程序在运行的时候,这些部分大概都在内存中的哪些地方。

 #define OFF 0x00          //宏定义不占用内存空间,宏在预处理阶段会被替换掉,执行文件中并不存在宏定义.float Num = 3.14;         //全局变量,存在于“变量区”char* str = NULL;         //全局变量,存在于“变量区”int main(){int time;               //局部变量,存在于“栈区”char* path = "C:\\Users";   //字符串常量,存在于“常量区”int Users_Num[8];       //局部变量,存在于“栈区”srt = (char*)malloc(10);    //申请动态存储区,存储于“堆区”static flaot con = 1.0;   //静态局部变量,存在于“变量区”//程序代码区delay_ms(time);                  //time未初始化,该变量为垃圾值strcap(str,"Hello World");   //字符串“hello World”比str申请的内存空间大,造成访问越界free(str);                        //释放str内存str = NULL;                    //使str指针指向空地址,方便下次使用}

访问越界:

Demo程序上的strcap()语句出现后面字符串大小比前面str变量申请的空间内存大小大的情况就会出现访问越界的情况。写程序时尤其要关注那个字符串它到底有多长,一定要去留意一下。如果出现访问越界的问题有些编译器是可能识别不出来的,但确实会造成这个内存访问错误,除此之外还有一些类似的:比如像sprintf(),strcat()等函数都有可能会导致访问越界的情况发生。

还有就是数组,数组也是特别容易造成访问越界的,有些编译器可能会检测数组长度是否超出数组下标长度,但有的地方未必就能检测出,如将数组在for()循环里访问的,这个时候就需要注意了,千万小心不要让它出现访问越界的情况。因为编译是检测不出来的,但是在运行的时候就会出现内存访问的故障了。

栈区:

根据上面Demo程序写的我们知道局部变量是存在于“栈区”的,所以一般我们的局部变量通常不要定义的太大,尤其是一些数组变量,如果说非常大,就会占用非常大的栈区空间,那么这在程序运行的时候非常容易出现栈溢出。平常我们程序里不可避免的会调用一些函数,所以我们调用一些函数的时候最好不要有深层次的调用,因为在调用函数的过程中栈区会不停的存储函数相关的一些变量和一些地址。所以需要深层次的函数递归调用的时候,大家尽量采用别的方式去代替。

堆区:

当申请了动态区域,用完的时候一定要记得释放(free),如果没有释放,那么这块内存区域就将处于不可用状态(就像占着茅坑不拉屎一样),程序大了或运行久了就极有可能会导致内存的泄露(重启一下就能解决90%的问题根源),同时我们在释放的时候也要注意释放的内存只能释放一次,不要重复的释放,有的时候代码量会比较大,所以有可能会在不止一处地方进行了代码的释放操作。因为我们内存释放了一次后,该内存区域就有可能用来做别的事了,如果这时候我们又再释放一遍就很有可能会出现问题了。释放完之后最好把指针指向空地址,避免下次再使用指针的时候出现地址的错误。

以上都是我们平时在开发的过程中需要格外注意的。有了这么一个概念之后再写代码或者在规划代码的时候,心里能够有个数,我们知道这些东西都大概在内存的哪个地方,这样就会尽量的去避免出现内存溢出或泄露的问题。也能够提高我们代码的效率。

像关于程序变量和内存分配,都是需要我们时刻关注的问题。我相信有不少人在这块犯过很多的错误,也可能说明我们基础不够扎实,编写程序的习惯也不够好。(但可能也有人受不了内存泄漏的折磨,而开发了“自动垃圾回收机制gc”,然后就有了Java)

作者:Micah

【华为云技术分享】容易造成单片机内存溢出的几个陷阱相关推荐

  1. 【华为云技术分享】三大前端技术(React,Vue,Angular)探密(下)

    [华为云技术分享]三大前端技术(React,Vue,Angular)探密(上) [Angular] Angular(通常被称为 "Angular 2+"或 "Angula ...

  2. 【华为云技术分享】“技术-经济范式”视角下的开源软件演进剖析-part 1

    前言 以互联网为代表的信息技术的迅猛发展对整个经济体系产生了巨大的影响.信息技术的发展一方面使知识的积累和传播更加迅速,知识爆炸性的增长:另一方面,使信息的获取变得越来越容易,信息交流的强度逐渐增加, ...

  3. 【华为云技术分享】“技术-经济范式”视角下的开源软件演进剖析-part 3

    4. 微观层面 4.1 个体动机 在开源软件发展之初, 商业组织的投入很少甚至没有, 完全是靠Richard Stallman 或者 linus Torvalds 这样的个人在努力推动开源软件艰难前行 ...

  4. 【华为云技术分享】直播回顾丨激发数据裂变新动能,HDC.Cloud云数据库前沿技术解读

    3月24日14:00-17:00,HDC.Cloud开发者沙龙系列云数据库专场直播线上开启,此次华为云数据库通过三场直播从NoSQL数据库新技术.数据库迁移.行业解决方案等方面对云端数据库进行深度解读 ...

  5. 【华为云技术分享】在 K8S 大规模场景下 Service 性能如何优化?

    摘要:Kubernetes 原生的 Service 负载均衡基于 Iptables 实现,其规则链会随 Service 的数量呈线性增长,在大规模场景下对 Service 性能影响严重.本文分享了华为 ...

  6. 【华为云技术分享】解析:物联网数据分析服务如何做?

    [摘要] 物联网设备正在产生大量的数据,如何为开发者提供简单有效的数据分析服务,简化开发过程,提升开发效率,让IoT数据快速变现是一个摆在我们面前的问题. 没有疑问,我们已经身处物联网时代了,每天都有 ...

  7. 【华为云技术分享】AI 开发路漫漫,什么才是真正的极客精神?

    摘要:AI开发看上去很美,实践起来却不是一件容易的事.一个聪明的开发者知道借助工具提升开发效率,一个智能的平台则会站在开发者的立场,为用户提供贴心服务. "理想很丰满,现实很骨感." ...

  8. 【华为云技术分享】前端工程师必备:从浏览器的渲染到性能优化

    摘要:本文主要讲谈及浏览器的渲染原理.流程以及相关的性能问题. 问题前瞻 1. 为什么css需要放在头部?2. js为什么要放在body后面?3. 图片的加载和渲染会阻塞页面DOM构建吗?4. dom ...

  9. 【华为云技术分享】用人工智能技术推动西安民俗文化,斗鱼超管团队有一套

    摘要:AI成为传统文化发展的助推器,助力传统文化朝着大众化.数字化.个性化.精准化方向发展,赋予传统文化新的生机,延续传统文化新的生命."斗鱼团队"从五个方面进行阐述"纵 ...

最新文章

  1. 用nginx搭建基于rtmp或者http的flv、mp4流媒体服务器
  2. desk next the to_仁爱版七年级下册英语句型转换题型专练
  3. 数据采集技术python网络爬虫答案_高校邦网络数据采集与Python爬虫【带实验】章节答案...
  4. 计算机听不到音乐怎么回事,Win10电脑设置麦克风提示“计算机听不到任何声音”如何解决...
  5. linux 复制文件 中文,linux中cp命令如何复制文件
  6. (相当全面)node.js 初体验
  7. Kafka和RocketMQ底层存储:零拷贝技术
  8. 计算机组成原理 第三章 存储系统
  9. 中国体外冲击波碎石机市场趋势报告、技术动态创新及市场预测
  10. 暴雪2013年内发布linux游戏,只因win8是场灾难?
  11. 6.打包和部署应用 6.1创建可执行的JAR的Spring Boot
  12. python异常和错误的区别_python中错误和异常有什么区别
  13. matlab如何仿真递推型dft算法,并联型有源滤波器的设计与仿真
  14. 计算机仿真 是核心吗,《计算机仿真》北大核心
  15. it职位简称_IT行业的英文职位名称
  16. 洛杉矶凌晨4点-------启航
  17. 移植st官方usb-hid程序出现babble detected错误
  18. Java通过SMS短信平台实现发短信功能
  19. mysql登录框万能密码_Sqli-LABS通关笔录-11[sql注入之万能密码以及登录框报错注入]...
  20. 十二、偏向锁、轻量级锁、重量级锁,锁的膨胀过程

热门文章

  1. 视觉SLAM十四讲学习笔记-第七讲-视觉里程计-特征点法和特征提取和匹配实践
  2. 八.激光SLAM框架学习之LeGO-LOAM框架---框架介绍和运行演示
  3. android 属性动画恢复,android – 使用AnimatorSet恢复动画
  4. java swing界面工具_Java GUI swing 工具包使用总结
  5. mac cad石材填充图案_CAD怎么填充颜色?
  6. 怎么修改db2服务器名字,服务器创建db2数据库实例名
  7. 硬件创新需要去理解的点(精炼总结)
  8. pycharm 激活方法分享(有效期至2099)
  9. Zabbix实战-简易教程--订阅类
  10. animate.css官网