【C语言】初识内存开辟/分配
提示:这篇文章主要用于自己理解更好的理解内存空间,以便更好的学习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”(程序在运行期间不能被改变的量)。
相关文章
- SQL Server 2014内存优化表的使用场景
- linux系统查看内存,按内存大小排序
- 深入学习Redis(1):Redis内存模型
- C语言中的内存分配与释放
- C语言 内存分配 地址 指针 数组 参数 解析
- 《嵌入式Linux与物联网软件开发——C语言内核深度解析》一1.5 C语言如何操作内存
- 《DB2性能管理与实战》——2.2 共享内存与私有内存
- 2015第27周三Java内存模型
- C语言程序内存的分区
- Redis基础:特点(内存运行、原子性、持久化)、5种基本数据类型与3种特殊数据类型、redis命令、发布订阅机制、事务(单条命令原子性事务不是原子性)、数据备份与恢复、安全
- 【C语言进阶】深度解析数据在内存中的存储
- JAVA内存结构详解
- 一个JSP结果页面tomcat内存溢出
- iOS - Block产生Memory Leaks循环引用导致的内存泄漏以及解决方案
- C Memory Layout C语言中的内存布局
- C语言学习笔记——内存