[温馨提示]
在初学这一节时,必然会感到困难,但这一节恰巧又是C语言运行的真谛,可以先简单的过一遍,学到后面章节时还需要再回来反复观看、消化本节。
一、计算机内存
我们今天开始学习C语言的内存管理,首先要了解一下计算机的内存由哪些部分组成。
计算机内存主要由随机存储器、只读存储器和高速缓存三部分组成:
除此之外,计算机内存也包括其他类型的存储器,例如串行和并行接口所使用的存储器芯片、CMOS RAM芯片以及CD-ROM、DVD-ROM等光盘存储器。
我们运行C语言代码,其实就是对计算机内存中的随机存储器的数据进行修改!
前辈,你之前不是说过,是通过寄存器来修改计算机的内存吗?寄存器不属于计算机的内存吗?
记性不错嘛!这是两个维度的理解,寄存器其实是CPU的高速存储部件,用于存储CPU内部的操作和运算
诶?CPU是什么呢~能具体说说吗?
CPU是“Central Processing Unit”(中央处理器)的缩写,是计算机的处理器,它负责执行程序中的指令,处理数据和执行计算,可以说CPU就是计算机的大脑,它决定了计算机的性能、速度和处理能力。
我们在运行C语言代码时,代码会被编译成可执行文件,并存储在硬盘等存储介质上。在程序运行时,操作系统会将可执行文件加载到内存中,存放在随机存储器的代码段。
CPU会从计算机内存中读取指令和数据,然后CPU根据指令的类型和操作码,控制运算器执行相应的运算操作,并将结果存储在寄存器中。所以说,寄存器只是存放我们代码中的操作和运算指令,让CPU知道要做什么,然后CPU根据指令去修改计算机内存中的数据。
关系好复杂。。。我先记下了(回头再捋一捋~)
二、计算机内存管理
我们前面说了,计算机的内存分为:随机存储器、只读存储器和高速缓存三个部分,我们C语言运行时的内存操作都是在随机存储器中进行的,所以我们学习C语言,重点还是要学习计算机 [ 随机存储器 ] 的构成。
我们可以把C语言中的内存看作是随机存储器的一种形式,这段内存从低地址到高地址可以划分为:内核、栈、堆、数据段、代码段、不可访问区
低地址和高地址?!?是什么意思啊QAQ。。。
哈哈,不要担心,听我慢慢道来。C语言中的内存是可以划分为多段的,但是怎么去区分这么多段内存呢?我们用到了地址,这个地址用来表示某一段内存在整个内存中的位置。
靠近内存最开始的地方,我们称为「低地址」,而靠近内存最末尾的地方,我们就称为「高地址」。
原来是这么个低地址和高地址!那可不可以再分别讲讲你刚才说的内核、栈、堆、数据段、代码段、不可访问区。
当然可以!且听我就着上面的模板一 一道来。
内核,是指运行C语言代码的系统(如Windows系统,Linux系统)的内核,位于内存的最低地址
紧靠着内核下面的一段空间,就是栈空间,是系统自由调度的空间,它由低地址不断向高地址延展
当然!栈也不能无限向下延展,紧挨着栈空间的,是堆空间,是用户自由调度的空间,它由高地址不断向低地址延展。同理堆也不能无限向上延展,它的极限是与栈空间的临界区域
堆的下面就是数据段了,这个数据段用来存放一些既不能被系统也不能被用户自由调度的数据,它们在系统运行结束时才会被释放掉,这些数据贯穿了系统运行的整个过程。
数据段之下就是我们之前提到过的代码段了,它用来存放我们编写的代码以及系统初始化代码,系统在运行时,CPU会在代码段读取代码段中的指令,并把它存放到寄存器,以便执行人们下达的指令
最后,靠近内存最末端的部分就是不可访问区了,它存放着系统运行时非常重要的数据,所以不允许任何访问请求,这也是操作系统内存的一种保护机制。
好了,以上就是对于计算机内存管理的大概描述,便于我们理解系统和用户对内存的调度规则。
呼~(终于讲完了)前辈,到底什么时候才能敲代码啊。。。今天讲了好多的理论,我都快受不了了ε=ε=ε=(#>д<)ノ
哈哈!我们马上进入正题,敲代码!!!
三、内存管理实践
前辈前辈!前面的代码我还不太明白,能帮我逐行讲解一下吗:
#include <stdio.h>
int main()
{
printf("Hello world!\n");
return 0;
}
好的!我先用"//"给这段代码写上注释,你看看能不能明白:
#include <stdio.h> //C语言标准输入输出的头文件,
//有了它就可以使用stdio.h文件里的库函数了,如下面的printf
int main() //主函数,系统运行开始的地方
{
printf("Hello world!\n"); //调用printf库函数,功能:打印"Hello world!"
return 0; //表示main函数结束,系统退出的地方
}
哇(眼冒金光)!有了前辈的注释,我也能大概理解了
嗯嗯,你先知道这段代码的大概功能,具体这些代码是什么,我们后面还会提到。我给你写一段有关内存管理的代码:
#include <stdio.h>
int main()
{
int a = 10 ; //系统申请一段内存,给这段内存命名为a,内存里的数值设置为10
printf("%d\n",a); //打印内存a中的数值
return 0;
}
上面的代码中,我用"int"关键字,在栈空间申请了一段"int"大小的内存,给这内存取名为a,然后又用"="操作符,在内存中放入了10这个数据。
下一行我又用printf函数检验前面的操作是否成功,就是打印刚刚的内存a,看看里面的数值是不是10,如果是的话,就说明这段内存a申请成功了!
哦哦!原来是这样啊~那么int到底是什么呢?
哈哈,这就涉及到变量这个知识点了,且听下回分解~
[end]