1 C语言与内存

1 计算机程序

1.1 程序

程序就是一堆代码加一堆数据,程序=数据+算法。

1.2内存

内存分为静态内存(SRAM)和动态内存(DRAM)。静态内存是指程序开始运行时由编译器分配的内存,它的分配是在程序开始编译时完成的,不占用CPU资源;由于堆空间只能在程序运行时被使用,因此堆空间也被称动态内存,另外,动态内存只能在程序运行时通过指正对分配给各种变量、字符串和数组(只能通过指针来访问堆空间)。
区别:静态内存程序访问速度快,可以提高程序的性能

1.3 存储结构

按照数据(全局变量和局部变量)和代码(函数)的存储方式的不同,可以分为冯诺伊曼结构和哈佛结构。冯诺伊曼结构数据和代码存储在同一存储器中,而数据和代码共用一条传输总线。哈佛结构是将程序和数据分开存储,程序和数据的存储可以同时进行,可以使程序和数据有不同的数据宽度,并且在执行时还可以预先读取下一条指令,因此哈佛结构的执行效率高

1.4 如何管理内存

有操作系统时,操作系统把内存分成一块一块的页面(一块一般是4K),然后以页面的单位来管理,页面内用更细小的字节为单位管理。动态内存分配时,操作系统提供了接口,只需用API来管理内存。
无操作系统(裸机程序)时,需要自己编程来计算内存的使用和安排,这属于静态内存分配。

1.5 内存的编程模型

内存实际上是由无限多个内存单元格组成的,每个单元格有一个固定的内存地址,这个内存地址和内存单元格唯一对应且永久绑定。
实际上内存的大小是有限制的,如32位系统,指的是32位数据总线,但是一般地址线也是32位,这个地址线决定了内存只能有32位二进制,所以逻辑上的大小为2的32次幂,也就是4G。
所谓的三总线说的是控制总线(传输写指令),地址总线(传输内存地址)、数据总线(传输写入内存的数据)

1.5 内存单位

1GB=1024MB 1MB=1024KB 1KB=1024B 1B(位)=8bit(字节)
内存宽度(内存数据线的数量)是指在一定时间(时间指的是一个时钟周期)内所能传送数据的位数,位数越大,所能传输的数据量就越大。

1.6 内存编址和寻址、对齐

(1)内存编址

无论多少位的没存,都是以字节为单位进行内存编址,内存地址与内存空间(也就是内存单元)是一一对应的关系且永久绑定的。

(2)内存对齐

对齐访问更符合硬件规律,效率更高,除了直接使用汇编外,使用高级语言编写程序时,内存空间分配都会自动对齐。

1.7 C语言如何操作内存

(1)对内存地址的封装

C语言中数据类型的本质含义,是表示一个内存格子的长度和解析方法,如int类型的长度是4,解析方法可以通过内存地址的不同类型来指定内存单元格子中二进制数的解析方法。
在C语言中,函数就是一段代码的封装,函数名是一段代码的首地址,所以说函数的本质是一个内存地址。有了函数名(指针),也就是有了地址,才能实现函数的调用。

(2)用指针间接访问内存

指针就是地址,指针是一个变量,且这个变量是专门存放地址的。
C语言中的指针全名叫指针变量,类型只是对其所修饰的数字或符号所代表内存地址的长度和解析方法的规定。如int a和int *p都代表一个内存地址,只是它们的长度和解析方法不同,前者的解析方法是按照int来规定的,后者是按照 int *方式解析,表示变量p里面存放的地址指向的空间用于存放一个int型的整数。

(3)用数组来管理内存

数组的定义是在内存中开辟一块连续的内存空间,并且数组名是其开辟的内存空间的首地址。由此定义可知,定义数组是一次性定义一堆变量,并且这些变量在内存中开辟的空间地址是连续的,第一个变量的地址记录在数组名中。
优点:数组定义简单,访问方便
缺点:数组中的所有元素类型必须相同;数组的空间大小确定后不能修改;数组的空间必须是连续的。

1.8 内存管理

(1)结构体

结构体属于聚合数据类型,提供一种把各种相关且类型可能不同的数据组合到一起的手段。结构体变量在定义后,编译器在编译的时候会为所有成员分配空间。向函数传递结构时,实际上是传递结构成员的值即值传递方式(包括用结构体变量作为函数参数以及函数返回值也是结构体变量的情况),结构体变量名代表是整个结构体变量,而不像数组名代表地址。

(2)栈

栈是一种数据结构,C语言使用栈来保存局部变量(非静态局部变量),是一种维护内存的机制。
栈内存的特点
1.空间实现自动管理:运行空间自动分配,运行结束空间自动回收。
2.能够被反复使用:程序通过自动开辟和自动释放,会反复使用同一块内存空间。
3.脏内存:栈内存由于反复使用,每次使用后程序不会去清空内容,因此当下一次该空间再次被分配时,上一次使用的值会还在。
4.临时性:函数不能返回栈变量的指针,因为这个空间在函数运行结束后就会被释放。
栈的特点是先进后出,入口即出口,只有一个口,另一个口堵死的。

(3)堆

堆是一种动态内存管理方式,特点是自由的(随时申请、释放、大小块随意)。

堆管理内存的特点:

1)容量大,动态分配(常规使用的需求容量都能满足),所谓的动态是指程序运行中是取得内存空间,而不是编译时就确定好固定大小的内存空间
2)申请和释放都需要手工进行,也就是需要程序员写代码明确进行申请和释放。
3)脏内存
4)临时性,堆内存在malloc后和free之前可以被访问。
使用堆内存注意事项
(1)malloc返回的是void *类型(这段空间存放的数据类型不确定)的指针(地址),该地址是本次申请的内存空间的首字节地址。
(2)void类型,表示万能类型,在需要的时候再具体指定。
(3)malloc的返回值,空间申请成后返回空间首字节地址,申请失败返回NULL,所以malloc获取的内存指针使用前一定要先检验是否为NULL。
(4)手动释放

C语言操作堆内存的接口(malloc/freee)

堆内存释放直接使用free释放
堆内存申请:malloc、calloc、realloc。malloc只能从内存中申请规定大小的内存,calloc会将返回的内存初始化为0,realloc可以修改原先已经分配好的内存块的大小。

局部变量存在于栈中,全局变量存在于静态数据区中,动态申请数据存在于对重。
静态存储区

静态局部变量和全局变量都存储在静态存储区中,编译器在编译程序时就确定了静态存储区的大小,静态存储区随着程序而分配空间,直到程序运行结束才释放空间。

1.9 内存中的各个段

(1)代码段.text:存放的是程序的代码部分,程序中的各种函数指令就存放在该段。
(2)数据段.data:也称为数据区、静态数据区、静态区,程序中的静态变量空间(全局变量和局部比那两)。
(3).bss段:所有未初始化的静态变量空间开辟于此,自动将未初始化静态空间初始化为0。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值