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

本文深入解析C/C++内存管理,涵盖栈区的局部变量、堆区的动态内存分配、静态区的生命周期和常量区的特点。了解内核空间、内存映射和不同区域的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

提示:这篇文章主要用于自己理解更好的理解内存空间,以便更好的学习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”(程序在运行期间不能被改变的量)。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_麦子熟了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值