本文是基于嵌入式的C语言

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

内存编址方法
  内存在逻辑上就是一个一个的格子,这些格子可以用来装东西(里面装的东西就是内存中存储的数),每个格子有一个编号,这个编号就是内存地址,这个内存地址(一个数字)和这个格子的空间(实质是一个空间)是一一对应且永久绑定的。这就是内存的编址方法。
  在程序运行时,计算机中CPU实际只认识内存地址,而不关心这个地址所代表的空间在哪里,怎么分布这些实体问题。因为硬件设计保证了按照这个地址就一定能找到这个格子,所以说内存单元的2个概念:地址和空间是内存单元的两个方面。

内存和数据类型的关系
C语言中的基本数据类型有:char short int long float double
int 整形(整数类型,这个整就体现在它和CPU本身的数据位宽是一样的)譬如32位的CPU,整形就是32位,int就是32位。
数据类型和内存的关系就在于:
数据类型是用来定义变量的,而这些变量需要存储、运算在内存中。所以数据类型必须和内存相匹配才能获得最好的性能,否则可能不工作或者效率低下。
比如:在32位系统中定义变量最好用int,因为这样效率高。原因就在于32位的系统本身配合内存等也是32位,这样的硬件配置天生适合定义32位的int类型变量,效率最高。也能定义8位的char类型变量或者16位的short类型变量,但是实际上访问效率不高。
再如:在很多32位环境下,我们实际定义bool类型变量(实际只需要1个bit就够了)都是用int来实现bool的。也就是说我们定义一个bool b1;时,编译器实际帮我们分配了32位的内存来存储这个bool变量b1。编译器这么做实际上浪费了31位的内存,但是好处是效率高。

内存管理

说到内存管理就要说到数据结构和堆。

最简单的数据结构——数组。当程序中有许多相同类型的数据需要同意管理时,单个的变量会显得比较臃肿和杂乱,这时候就需要数组来有效管理数据,也就是对应于内存。但很明显数组的优缺点从其使用特性中显露无遗。 优势:数组比较简单,访问用下标,可以随机访问。缺陷:1 数组中所有元素类型必须相同;2 数组大小必须定义时给出,而且一旦确定不能再改。针对数组的优缺点,结构体便隆重登场。

结构体。在管理一个或几个事物的不同属性,在数据上体现为不同的变量,这时,数组就会说“老子干不了”。结构体就是为了此种情况而生。比如,需要管理学生信息,就可以创建如下结构体,以便统一整齐管理。

  struct student

  {

    unsigned int age;

    char name[20];

  }

栈是一种数据结构,C语言中使用栈来保存局部变量。栈是被发明出来管理内存的。其管理内存的特点是小内存、自动化。

C语言中的局部变量是用栈来实现的。
我们在C中定义一个局部变量时(int num),编译器会在栈中分配一段空间(4字节)给这个局部变量用(分配时栈顶指针会移动给出空间,给局部变量a用的意思就是,将这4字节的栈内存的内存地址和我们定义的局部变量名a给关联起来),对应栈的操作是入栈。
注意:这里栈指针的移动和内存分配是自动的(栈自己完成,不用我们写代码去操作)。
然后等我们函数退出的时候,局部变量要灭亡。对应栈的操作是弹栈(出栈)。出栈时也是栈顶指针移动将栈空间中与a关联的那4个字节空间释放。这个动作也是自动的,也不用人写代码干预。栈的小内存特点可以说是其的缺点,所以所以我们在C语言中定义局部变量时不能定义太多或者太大(譬如不能定义局部变量时 int a[10000];)。

堆(heap)是一种内存管理方式。内存管理对操作系统来说是一件非常复杂的事情,因为首先内存容量很大,其次内存需求在时间和大小块上没有规律(操作系统上运行着的几十、几百、几千个进程随时都会申请或者释放内存,申请或者释放的内存块大小随意)。
堆这种内存管理方式特点就是自由(随时申请、释放;大小块随意)。堆内存是操作系统划归给堆管理器(操作系统中的一段代码,属于操作系统的内存管理单元)来管理的,然后向使用者(用户进程)提供API(malloc和free)来使用堆内存。
我们什么时候使用堆内存?需要内存容量比较大时,需要反复使用及释放时,很多数据结构(譬如链表)的实现都要使用堆内存。
堆管理内存的特点(大块内存、手工分配&使用&释放)
1:容量不限(常规使用的需求容量都能满足)。
2:申请及释放都需要手工进行,手工进行的含义就是需要程序员写代码明确进行申请malloc及释放free。如果程序员申请内存并使用后未释放,这段内存就丢失了(在堆管理器的记录中,这段内存仍然属于你这个进程,但是进程自己又以为这段内存已经不用了,再用的时候又会去申请新的内存块,这就叫吃内存),称为内存泄漏。

转载于:https://www.cnblogs.com/printf631/p/7765878.html

C语言(记录)——内存相关_2:内存的编址与管理相关推荐

  1. java non-heap_成都汇智动力-Java内存相关

    原标题:成都汇智动力-Java内存相关 Java内存模型 可见性:一个线程对共享变量值的修改,能够及时地被其他线程看到.语言层面上支持两种 synchronized 和 volatile. 共享变量: ...

  2. C语言中常见的内存相关的Bugs

    这里写目录标题 内存相关的Bugs 一.常见的错误参考 1.经典的scanf bug 2.指针未正确初始化 3.指针被释放时没有置空 4.不要用return语句返回指向"栈内存"的 ...

  3. linux kernel 内存相关记录

    本篇文章是学习了<linux内核设计与实现>和<linux设备驱动开发详解>关于linux 内存部分的记录. MMU 内存管理单元,提供虚拟地址和物理地址映射.内存访问权限.c ...

  4. C语言深度剖析书籍学习记录 第五章 内存管理

    常见的内存错误 定义了指针变量,但是没有为指针分配内存,即指针没有指向一块合法的内存. 结构体成员指针未初始化 很多初学者犯了这个错误还不知道是怎么回事.这里定义了结构体变量 stu,但是他没 想到这 ...

  5. [译]提案:在Go语言中增加对持久化内存的支持

    作者:Jerrin Shaji George.Mohit Verma.Rajesh Venkatasubramanian.Pratap Subrahmanyam Jerrin Shaji George ...

  6. 【JVM高级特性与最佳实践(第3版)-周志明】-学习记录之【自动内存管理】

    写在前面,不是原创,是周志明老师书里得内容,方便个人随时学习查看,因为发布得时候没有这个选项,只能选原创 一.概述 对于Java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要为每一个new操作 ...

  7. C语言基础教程_动态内存申请

    文章目录 前言 一.动态分配内存概述 二.静态分配.动态分配 2.1静态分配 2.2动态分布 三.动态分配函数 3.1 malloc 3.2 free 3.3 calloc 3.4 realloc 四 ...

  8. C语言中的指针和内存泄漏

    对于任何使用 C 语言的人,如果问他们 C 语言的最大烦恼是什么,其中许多人可能会回答说是指针和内存泄漏.这些的确是消耗了开发人员大多数调试时间的事项.指针和内存泄漏对某些开发人员来说似乎令人畏惧,但 ...

  9. c语言中较常见的由内存分配引起的错误_内存越界_内存未初始化_内存太小_结构体隐含指针...

    1.指针没有指向一块合法的内存 定义了指针变量,但是没有为指针分配内存,即指针没有指向一块合法的内浅显的例子就不举了,这里举几个比较隐蔽的例子. 1.1结构体成员指针未初始化 1 2 3 4 5 6 ...

最新文章

  1. 腾讯面试官问我Java中boolean类型占用多少个字节?我说一个,面试官让我回家等通知...
  2. yii2 跨域请求配置_伸手党系列四:vuecli3.0以上 使用 proxy 进行跨域设置
  3. moss 2007 单点登录的配置
  4. 电气工程师学python_Python 在电气工程及其自动化上有哪些应用?
  5. SLAM: 图像角点检测的Fast算法(OpenCV文档)
  6. OpenGL程序运行提示“glut32.dll丢失问题”
  7. 阿里修冶:微服务拆分之道
  8. linux c绑定cpu_Linux内核路径优化之多核心平台TCP优化
  9. 玩转 SpringBoot 2 快速整合拦截器
  10. 从零开始学Android!渣本毕业两年经验,附超全教程文档
  11. linux 批量更改三四级目录 扩展名,Linux批量更改文件后缀名
  12. 数分下第12讲(第9.6节) 梯度散度和旋度
  13. 需求调研第三篇--现场调研阶段容易犯哪些错误
  14. 飞秋教程 2013 阳阳整理完整版
  15. RPC开发系列九:优雅启动
  16. 程序员放弃阿里60w年薪,选到手5k的公务员,网友评论:后悔去吧
  17. ​ 每周一书《数学之美 第二版》分享!
  18. 如何下载安装Devc++
  19. 英语语法——特殊结构
  20. NISP模拟试题----2020大学生网络安全竞赛决赛

热门文章

  1. 从零开始学PowerShell(4)数据的选择、排序与格式化
  2. C/C++的readdir和readdir_r函数(遍历目录)
  3. python小练习—名片管理系统(增、删、改、查、数据本地保存)
  4. 8.1 shell介绍 8.2 命令历史 8.3 命令补全和别名 8.4 通配符 8.5 输入输出重定向
  5. 命名空间 namespace
  6. curl和file_get_contents 区别以及各自的优劣
  7. 判断Python输入是否为数字
  8. 房贷新政刺激楼市作用有限 房价严重背离无改变
  9. Tomcat JVM 初始化加大内存
  10. Java static用法代码讲解