C语言—内存的五大区域/C、C++在内存中的存储方式

C/C++程序在内存中的存储方式
在之前的学习中,我们已经了解了内存的基本定义:内存(Memory),是计算机的一种存储设备,其主要作用是进行程序的运行和一些中间数据的存储。
在C/C++程序的运行过程中,不同类型的数据存储在内存的不同区域中,由此,引出今天的学习内容: 内存的五大区域
内存分为五大区域,分别存储不同类别的数据。五大区域分别为: 栈区Stack,堆区Heap,BSS区,数据区(常量区)Data和代码区Text。
因为内存的主要功能是程序的运行,那么要理解内存五大区的划分依据,我们就要了解一个程序的基本结构。
一个可执行的二进制程序(未运行时)的组成包括三大部分:代码段、数据段和BSS段。
        一个可执行的二进制程序=程序段Text+数据段Data+BSS段
一个运行的二进制程序的组成在未运行程序的组成上增加了两个存储区域:栈区Stack和堆区Heap。
       一个运行中的二进制程序=栈区Stack+堆区Heap+BSS区+数据区Data+程序区Text
在程序的运行过程中,操作系统自动地为程序划分出一块存储中间数据的存储区域——栈区。而堆区不由操作系统自动分配,而是一块需要程序员向系统申请的存储空间。
为了弄清楚栈区和堆区分配方式的不同,我们需要了解两个概念: 静态分配和动态分配。
  1. 静态分配:是指在程序运行前,编译器对程序进行的一次性的存储空间的划分。
  2. 动态分配:是指在程序的运行过程中,根据程序的指令需求,系统接收到分配指令后,给程序划分出的存储空间。由于程序员要求的存储空间系统不能自知,所以必须要程序员使用一定的指令来申请一定大小的存储空间。
静态分配和动态分配的主要区别就是:静态分配在程序运行前的在编译过程中,系统自动完成;而动态分配则是在程序的运行过程中再次划分。

下面,分析五大区域各自存储的数据类别
  1. 栈区Stack:主要存储运行程序的中间结果和断点信息。包括一些函数的参数和局部变量的值。由系统自动分配和释放。在内存中,栈是一块形同数组的连续存储空间,数据的存储遵循“先进后出”的原则,栈区域的地址由高地址向低地址增长,也就是说,存放的数据越多,栈顶的地址越低。
  2. 堆区Heap:是由程序员自行向系统申请的一块存储空间,需要程序员自行释放。在内存中,堆区并不是有连续的存储地址组成,而是以链表的形式,将许多地址不连续的存储空间用指针进行链接。在堆区中,数据的存储遵循“一头进一头出”的原则。堆区域的地址由低地址向高地址增长。
  3. BSS区:主要存储没有进行初始化的全局变量和静态变量。在程序进行前,用0进行BSS区数据的初始化,在程序完成后BSS区自动清零。
  4. 数据区(常量区)Data:主要存储已经进行初始化的全局变量、静态变量和常量。
  5. 代码区Text:主要存储用二进制表示的程序代码。

简单来说,C/C++在内存中的存储占用五个区域,分别是:栈区Stack、堆区Heap、BSS区、数据区(常量区)Data和代码区Text。其中,栈区由系统在编译过程中自动分配;堆区在程序的运行过程中动态分配,由程序员控制堆区存储的开辟和释放;程序中的常量数据被分散在两个区内存储,一个是BSS区,存储没有进行初始化的全局变量和静态变量;另一个是数据区(常量区),存储已经完成初始化的全局变量、静态变量和一些常量;最后,程序代码由操作控制系统经过编译后传送给内存的代码区,即代码区中存储已经转换成二进制的程序代码。
  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值