C语言中内存分区划分区

  1. static的作用

(1) 修饰局部变量时,只初始化一次,延长了局部变量生命周期,直到程序结束才释放。

(2)修饰全局变量,全局变量智能在本文件访问,不能在其他文件访问。

(3)修饰函数同修饰全局变量类似,只能在本文件调用,不能在其他文件调用。

(4)不想被释放的时候,可用static修饰。

(5)考虑数据安全性,如当程序需使用全局变量时,应优先考虑static。

2. static全局变量和局部变量的区别?

静态全局变量:

(1)静态变量包况后面的静态局部变量,都在存储在全局/静态区。

(2)未经初始化的静态全局变量会被程序自动出初始化为0.

(3)静态全局变量在声明它的整个文件都可见,本文件之外均不可见,更不可用。(因此,其中的优点是,在其他文件中可以定义相同名字的变量,不会发生冲突。)

静态局部变量:

(1)存储在全局/静态区。

(2)静态局部变量在程序执行到对象声明处首次初始化,以后函数的调用不再初始化。

(3)静态局部变量一般在声明处初始化,如未显示初始化,会被程序自动初始化为0.

(4)静态局部变量始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当其定义的语句和函数结束时,其作用域也结束。

3.内存分区如下图所示:

4. 内存分区的各个分区存储说明:

(1) 栈:

由系统进行内存的管理。主要存放函数的参数以及局部变量,以及const修饰的局部变量以及块变量,在函数完成执行,系统自行释放栈区内存,不需要用户管理。整个程序的栈区的大小可以在编译器中由用户自行设定,VS中默认的栈区大小为1M,可通过VS手动更改栈的大小。

(2) 堆:

  由程序员手动申请,手动释放,若不手动释放,程序会一直占用内存,导致内存泄漏,在程序结束后,由系统自动回收,生命周期是整个程序运行期间使用malloc或者new进行堆的申请,堆的总大小为机器的虚拟内存的大小。

(3) 全局/静态存储区:

全局/静态存储区内的变量在程序编译阶段已经分配好内存空间并初始化。这块内存在程序的整个运行期间都存在,它主要存放静态变量、全局变量和常量。

静态区的特征:

静态区是一个抽象笼统的概念,在实际的Linux/C的可执行程序中并没有静态区这个区域,具体来讲它主要由两个段组成: .data 段和 .bss 段。

.data 段就是程序的数据段,在采用段式内存管理的架构中,数据段(data segment)通常是指用来存放程序中已初始化且不为0的全局变量或静态变量的一块内存区域。

BSS(Block Started by Symbol) 通常是指用来存放程序中未初始化的或初始化为0的全局变量或静态变量的一块内存区域。.data 段在程序编译期间其大小及数据被确定,而.bss段则没有直接分配空间而是由编译器在 .data 段之后为其预留空间,在程序装载进内存时被正式分配。尽管静态区由两个不同的段组成,但是在程序链接并装载进内存之后这两段不做区分。

全局/静态存储区分为.BSS段,全局区/数据区与只读常量区。

①  .BSS段:

通常是指用来存放程序中未初始化的全局变量静态局部变量。该区域会在main函数执行前进行自动清零。BSS是英文Block Started by Symbol的简称。

存储显式初始化为0与未初始化的全局变量(static修饰显式初始化为0与未初始化的局部变量)。

② 数据段(data段):

显式初始化非零的全局变量(static修饰显式初始化非0的局部变量)。

③ 只读常量区:

存放字符串常量,以及const修饰的全局变量。特点是只能读不能写,受到操作系统运行时保护,强行修改会导致 segmentation fault,生命周期同程序运行过程。

5. 总结:

数据区包括:堆,栈,全局/静态存储区;

全 局/ 静态存储区包括:常量区(静态常量区),全局区(全局变量区)和静态变量区(静态区)。 常量区包括:字符串常量区和常变量区;   

代码区:存放程序编译后的二进制代码,不可寻址区。

可以说,C/C++内存分区其实只有两个,即代码区和数据区。

  1. 代码区:存放待执行的代码。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值