365bet世界杯

C/C++内存几大分区和存储空间的布局

发布时间 2026-10-02 02:46:11 作者 admin 阅读 9535

先看一下可执行文件加载进内存后形成的进程在内存中的结构,如下图:

代码区:存放CPU执行的机器指令,代码区是可共享,并且是只读的。

数据区:存放已初始化的全局变量、静态变量(全局和局部)、常量数据。

BBS区:存放的是未初始化的全局变量和静态变量。

栈区:由编译器自动分配释放,存放函数的参数值、返回值和局部变量,在程序运行过程中实时分配和释放,栈区由操作系统自动管理,无须程序员手动管理。

堆区:堆是由malloc()函数分配的内存块,使用free()函数来释放内存,堆的申请释放工作由程序员控制,容易产生内存泄漏。

其中,BSS区由exec初始化为0,数据区和代码区由exec从程序文件中读入。

C语言中的存储类型有auto, extern, register, static 这四种,存储类型说明了该变量要在进程的哪一个段中分配内存空间,可以为变量分配内存存储空间的有数据区、BBS区、栈区、堆区。

1.auto

auto只能用来标识局部变量的存储类型,对于局部变量,auto是默认的存储类型,不需要显示的指定。因此,auto标识的变量存储在栈区中。

2.extern

extern用来声明在当前文件中引用在当前项目中的其它文件中定义的全局变量。如果全局变量未被初始化,那么将被存在BBS区中,且在编译时,自动将其值赋值为0;如果已经被初始化,那么就被存在数据区中。全局变量的生命周期是整个程序运行过程,为了节省内存空间,在当前文件中使用extern来声明其它文件中定义的全局变量时,就不会再为其分配内存空间。

3.register

声明为register的变量在由内存调入到CPU寄存器后,则常驻在CPU的寄存器中,因此访问register变量将在很大程度上提高效率,因为省去了变量由内存调入到寄存器过程中的好几个指令周期。

4.static

被static声明为静态类型的变量,无论是全局的还是局部的,都存储在数据区中,其生命周期为整个程序,如果是静态局部变量,其作用域为一对{}内,如果是静态全局变量,其作用域为当前文件。静态变量如果没有被初始化,则自动初始化为0。静态变量只能够初始化一次。

5.字符串常量

字符串常量存储在数据区中,其生存期为整个程序运行时间,但作用域为当前文件。

参考下图:

参考博客:https://blog.csdn.net/yu97271486/article/details/80444587

相关推荐

命运2能运营多久游戏

命运2是一款备受玩家喜爱的多人在线角色扮演游戏(MMORPG),其独特的游戏机制、丰富的游戏内容和精彩的游戏剧情吸引了无数玩家。然而,对

08-08 分类 bte365娱乐线

金士顿内存报价

金士顿内存报价 快速筛选 多项筛选 品牌: 多选 更多 不限 金士顿 美商海盗船 威刚 芝奇 佰维 影驰 三星 十铨科技 英睿达 宇瞻 金泰克 黑金刚

09-25 分类 365bet世界杯

三星S6818

答 现在让大家说你最熟悉的手机是那个品牌?肯定人们的回答是多种多样的,因为市场上的手机品牌非常地多,人们用的手机品牌非常地多,但

10-16 分类 super365体育官网下载

翠星上的加爾岡緹亞 哈啦板

【情報】GSC《翠星上的加爾岡緹亞》MODEROID 捷霸,開放預購中! ◤ 新商品情報 ◢ #MODEROID チェインバー ____________ ▼ご予約は

01-28 分类 365bet世界杯

uber扣费记录在哪看

当uber成为人们所必须的交通工具之一,使用的便捷性不言而喻,可是其尽然有隐形扣费的嫌疑。前几天朋友跟我讲说Uber客户端默认要收20%小费

02-10 分类 super365体育官网下载