【小宅按】 关于程序变量和内存分配,都是需要我们时刻关注的问题。我相信有不少人在这块犯过很多的错误,也可能说明我们基础不够扎实,编写程序的习惯也不够好。 总结一下关于程序的变量和内存方面的概念,虽然是属于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. 内存溢出_关于PermGen Space内存溢出解决方案

    内存溢出分为Heap Space和PermGen Space两种异常.正巧的是我这次就碰到了PermGen space异常,为了解决这个异常花了我 半天的时间,所以今天写这个方案就是做一种笔记. 刚开 ...

  2. jvm内存结构_浅谈JVM内存结构

    JVM 可以分为 5 个部分,分别是: 类加载器(Class Loader):加载字节码文件到内存. 运行时数据区(Runtime Data Area):JVM 核心内存空间结构模型. 执行引擎(Ex ...

  3. 全面理解java内存模型_深入理解Java内存模型(八)——总结

    处理器内存模型 顺序一致性内存模型是一个理论参考模型,JVM和处理器内存模型在设计时通常会把顺序一致性内存模型作为参照.JVM和处理器内存模型在设计时会对顺序一致性模型做一些放松,因为如果完全按照顺序 ...

  4. java if在内存中_全面理解Java内存模型

    Java 内存模型的抽象 在 java 中,所有实例域.静态域和数组元素存储在堆内存中,堆内存在线程之间共享(本文使用"共享变量"这个术语代指实例域,静态域和数组元素).局部变量( ...

  5. linux内存管理_浅谈Linux内存管理

    1. 扫盲篇 1.1 操作系统存储层次 常见的计算机存储层次如下: 寄存器:CPU提供的,读写ns级别,容量字节级别. CPU缓存:CPU和CPU间的缓存,读写10ns级别,容量较大一些,百到千节. ...

  6. unity如何检测内存泄漏_如何排查Java内存泄漏?看懂这一篇就够用了

    原文:https://www.toptal.com/java/hunting-memory-leaks-in-java 作者:Jose Ferreirade Souza Filho 译者:Emma来源 ...

  7. java怎么看内存值_【java】内存分析

    在J2SE中,通过进行内存分析,可以让我们更好的理解我们的程序在内存中是怎么被分配内存的.也能让我们更好的理解我们的代码是怎么运行的. 对于我自己来说分析内存也是一件很有趣的事情.所以下面通过一个例子 ...

  8. aep内存用法_一种AEP内存接口的压力检测方法及系统与流程

    本发明属于内存接口检测领域,具体涉及一种AEP内存接口的压力检测方法及系统. 背景技术: AEP内存简称Apache Pass DIMMs,为高性能和灵活性而设计的,The Intel® Optane ...

  9. 怎样清理苹果手机内存空间_怎样清理苹果手机内存?清理后流畅好几倍,网友:太好用了!...

    苹果手机的流畅度是无可厚非的,因为苹果手机流畅度很高,因此现在大多数不管是青年人还是上班族都喜欢用苹果手机,虽然苹果手机有各方面的缺点,比如手机耗电量太快耐电性不高,但是因为苹果手机流畅度的强大,完全 ...

最新文章

  1. c++重载运算符_Chapter13:重载——入门(一)
  2. python脚本 通过rsa private key 生成 publickey
  3. python空类型-python 空类型
  4. 用python随机画多个圆_Python Pygame随机绘制不重叠的圆圈
  5. 资源权限操作-查询所有资源权限
  6. 【2017年第3期】面向共享的政府大数据质量标准化问题研究
  7. POJ1279 Art Gallery 多边形的核
  8. 字典树 之 hdu 4099
  9. mysql开发认证 cmdev_学无止境:了解主流的DBA认证考试
  10. java使用过滤器/拦截器过滤response信息
  11. 计算机不工作时硬盘自动响,电脑硬盘不规律响的解决方法
  12. android7 cooldual,酷派Cool1Dual(含JUI 7.1)|Cool1C 免解锁 Recovery ROOT 救砖视频
  13. Python趣味脚本,做一个简单的抽奖刮刮卡
  14. uniapp - app 获取短信内容
  15. 中英文数字混合的复合格式处理
  16. Counterfeit Dollar(找硬币)
  17. 海信98E7G PRO 98英寸 评测
  18. 复选框 html 操作,HTML页面中复选框的操作方法
  19. Java实现 幸运数字
  20. mqtt调试工具下载

热门文章

  1. iOS开发中乱用hook可能导致灾难
  2. 2015下半年软考系统集成管理工程师10月8日作业
  3. 鸟哥Linux私房菜_基础篇(第二版)_第七章学习笔记
  4. 在Delphi程序中操作注册表
  5. 掌握 ASP.NET 之路:自定义实体类简介
  6. android谷歌返色状态栏实例,Android实现状态栏(statusbar)渐变效果的示例
  7. ipfs浏览器java实现_IPFS + Ethereum(上篇):JS+IPFS-API存储和获取数据
  8. idea 查看jsp是否被引用_全网最全的IDEA热部署方案,看完再也不用加班了!
  9. 联想拯救者y7000怎么配置Java环境_联想拯救者y7000重装系统教程
  10. boot访问resources下边的图片_SpringBoot系列之JDBC数据访问