zl程序教程

您现在的位置是:首页 >  硬件

当前栏目

【C语言】初识内存开辟/分配

内存C语言 分配 初识 开辟
2023-09-11 14:17:48 时间

提示:这篇文章主要用于自己理解更好的理解内存空间,以便更好的学习C语言的动态内存分配,很多内容资料都来自于其他大佬的博客。


前言

C/C++程序的内存分配主要有几个区域:内核空间,栈区,堆区,静态区(数据段),常量区,代码区
在这里插入图片描述

一,内核空间(用户代码不能读写)

假设有一个4G内存的电脑,那么可能2个G的内存都留给操作系统,内核是操作系统的内部核心程序,它向外部提供了对计算机设备的核心管理调用,用户是看不到的。我们将操作系统的代码分为两个部分:内核空间(内核地址所在的空间),外部管理程序(大部分是对外围设备的管理和界面操作)。外部管理程序与用户进程所占据的地址空间称为外部空间。

二,栈区stack(向下增长)

(1)栈区主要存放局部变量,函数的形参,返回数据,返回地址等。在执行函数时,函数内的局部变量的存储单元都可以在栈上创建(自动分别存储单元),函数执行结束时这些存储单元自动被释放。
(2)栈区由操作系统自动管理,无需开发人员手动管理。栈区是先进后出的原则,即先进去的被堵在最里面,后进去的在门口,释放的时候门口的先出去。
(3)假设在一段代码中,我们先创建局部变量int a,再创建局部变量int b,那么可以通过调试得到,b的地址是比a小的,所以栈区是向下增长的。
(4)栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量是固定的,不可变的,有限的。

三,内存映射

内存映射是在进程的虚拟地址空间中创建一个映射,分为文件映射,匿名映射(这个我们之后学操作系统的时候再学习)。

四,堆区(向上增长)

由程序员调用动态内存函数(malloc,free,calloc,realloc)来主动申请内存空间的,需用free()来释放内存,若申请了堆区的内存,忘记释放,很容易造成内存泄漏,程序结束时可能被OS回收。分配方式类似于链表。

五,静态区(数据段)

静态变量(static)和全局变量的存储区域是一起的,静态区的内存直到程序全部结束后才会被系统自动释放,延长了变量的生命周期。与栈区上的存储的区别就是,栈区上的内存单元是在函数执行结束后就自动被释放了。

六,代码区

存放程序的代码,即CPU执行的机器指令,只读性,共享性。

七,常量区

存放常量,如字符串常量char* p=“abcdef”(程序在运行期间不能被改变的量)。