内存布局:栈,堆,BSS段(静态区),代码段,数据段

什么是代码区、常量区、静态区(全局区)、堆区、栈区?

C/C++堆区、栈区、常量区、静态数据区、代码区详解

-----------------------------------------------------------          4G(0xffff ffff)

内核空间              应用程序不许访问

------------------------------------------------------------         3G

栈空间                 RW           局部变量保存位置

--------------------------------------------------------------

文件映射区

-------------------------------------------------------------

运行时堆空间                           malloc

--------------------------------------------------------------

全局的数据空间            RW     (初始化为非0的(data)、未初始或初始化为0的(bss))     data段    bss段

只读数据段rodate         R         “ Hello world ”,                                            rodata段

代码段(只读)                 R                code                                                       text段

---------------------------------------------------------------0x00

代码段、rodata段:代码段对应程序中的代码(函数),rodata段常用于存储常量数据

data段:存放被初始化为非0的全局变量、static修饰的局部变量
bss段:存放未被初始化或初始化为0的全局变量、static修饰的局部变量

文件映射区:进程打开文件后,将文件内容从硬盘读到进程的文件映射区,以后就直接在内存中操作这个文件,读写完成后保存时,再将内存中的文件写入硬盘中。

栈:局部变量分配在栈中。函数调用传参过程也会用到栈

内核空间:将操作系统内核程序映射到这个区域。对于linux中的每个进程来说,它都认为这个系统只有它自己和内核空间。

ubuntu@ubuntu-virtual-machine:~$ size structtext       data        bss        dec        hex    filename1267        560          8       1835        72b    struct

一个局部变量前进行static修饰时,作用范围没有变还是当前函数内部,但是函数返回时,并没有释放,这一变量将进入静态数据段中的全局数据空间。

栈地址:运行时,函数内部使用的变量,函数一旦返回,就释放,生存周期仅限于函数内部

堆空间:运行时,可以自由、自我管理的分配和释放空间,生存周期由程序员决定

分配:

malloc(),一旦成功,返回分配好的地址给我们,只需要接受,对于这个新地址的读法,由程序员灵活把握,输入参数决定分配的大小,单位是Byte。

  char *p;p = (char *)malloc(100);if(p ==NULL){error;}int a[5];

释放:

 free(p);       

存储类相关的关键字

auto:用来修饰局部变量(默认不写),分配在栈上(不初始化则值随机)。

static:用来修饰局部/全局变量,形成静态局部/全局变量。存储在全局数据空间

static修饰函数:作用范围仅限于它的源文件,即只有本文件内才可以调用,函数名在其他文件内不可见。(限定作用域)

static修饰局部变量:局限于特定函数,但出作用域并不释放,在函数体内静态变量的值也能维持。(限定生命周期)

static修饰全局变量:作用范围局限于它的源文件,即只有本文件内的代码才可以访问它,变量名在其他文件内不可见。(限定作用域)

register:使用这一关键字修饰变量。编译器会尽量将其分配在及寄存器中,变为寄存器变量,提高访问效率。

extern:使用extern修饰全局变量,可以跨文件访问变量。比如a.c中用extern声明了一个全局变量,则在其他文件中便可直接使用该变量

volatile:一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去优化这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
下面是volatile变量的几个例子:
1) 硬件会改变的变量(如:状态寄存器)
2) 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
3) 多线程应用中被几个任务共享的变量

三种链接属性:

内连接:static修饰的函数、全局变量
外链接:extern修饰的函数、局部变量
无连接:局部变量都是

C语言内存分布图----栈空间、堆空间相关推荐

  1. JVM学习笔记之-堆,年轻代与老年代,对象分配过程,Minor GC、Major GC、Full GC,堆内存大小与OOM,堆空间分代,内存分配策略,对象分配内存,小结堆空间,逃逸分析,常用调优工具

    堆的核心概述 概述 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域.Java堆区在JVM 启动的时候即被创建,其空间大小也就确定了.是JVM管理的最大一块内存空间. 堆内存的大小是可 ...

  2. 浅谈C语言内存(栈)

    浅谈C语言内存 文章目录 浅谈C语言内存 内存分配 栈 斐波纳契数列 内存分配 在C语言中内存分别分为栈区(stack).堆区(heap).未初始化全局数据区.已初始化全局数据区.静态常量区(stat ...

  3. Java内存分析—栈,堆,方法区

    Java内存分析-栈,堆,方法区 一.栈: 1).特点是:自动分配,连续空间,先进后出原则. 2).基本数据类型(一共有八种,char,byte,short,int,long,float,double ...

  4. java:栈空间,堆空间,方法区

    栈空间: 1. 栈是方法执行的内存模型,用栈存储方法执行的信息是再合适不过了.每个方法被调用都会创建一个栈帧(存储局部变量,操作数,方法出口等). 2. JVM为每一个线程创建一个栈,用于存放该线程执 ...

  5. 45.JVM调优策略、常见问题:内存泄漏(年老代堆空间被占满、持久代被占满、堆栈溢出、线程堆栈满、系统内存被占满)优化方法:优化目标、优化GC步骤、优化总结;案例分析(公司系统参数、网上给的配置参数)

    45.JVM调优策略 45.1.常见问题 45.1.1.内存泄漏 45.1.1.1.年老代堆空间被占满 45.1.1.2.持久代被占满 45.1.1.3.堆栈溢出 45.1.1.4.线程堆栈满 45. ...

  6. java 栈空间_初学JAVA——栈空间堆空间的理解

    1.Person pangzi;    //这是在"开拓空间"于栈空间 pangzi=new Person();    //这是赋值于堆空间 上两步就是在做与空间对应的事. 2.值 ...

  7. python什么是堆什么是栈_顶置篇:CPython的内存概念:栈、堆和引用

    我们知道在Python编程中,即便较为权威<Python编程指南>一书,也并没有要求Python读者去掌握系统性地理解CPython内部实现中的内存分配以及内存回收等知识.甚至泛滥于网络上 ...

  8. 关于内存中栈和堆的区别[转]

    1.内存分配方面: 堆:一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 .注意它与数据结构中的堆是两回事,分配方式是类似于链表.可能用到的关键字如下:new.malloc.delet ...

  9. [ZZ]关于内存中栈和堆的区别

    1.内存分配方面: 堆:一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 .注意它与数据结构中的堆是两回事,分配方式是类似于链表.可能用到的关键字如下:new.malloc.delet ...

最新文章

  1. java new string 图_Java中String直接赋字符串和new String的一些问题
  2. svn mysql认证_svnapachemysql 认证搭建
  3. 使用log_format为Nginx服务器设置更详细的日志格式
  4. 亚太运营商在5G速率上领先
  5. 使用LoadRunner对Web Services进行调用--Add Service Call
  6. 2的负x次幂图像_数学| NO.2,3 函数 T15
  7. Visual Studio 2010 C++ 用户属性设置
  8. ROS入门 TF与URDF
  9. 电脑运行java游戏_电脑里如何运行java软件或游戏
  10. 如何恢复计算机隐藏的文件夹,隐藏文件夹,小编教你电脑隐藏文件夹怎么恢复...
  11. Exploiting Deep Generative Prior for Versatile Image Restoration and Manipulation
  12. 线性回归算法梳理——Test1
  13. 克劳士比:有用的和可信赖的组织的核心是什么?
  14. lua mysql教程_Lua 数据库访问 - Lua 基础教程
  15. vulntarget-f
  16. springcloud的处理雪崩效应的Hystrix和服务监控Dashboard
  17. 海看股份创业板IPO过会:上半年营收近5亿元,称用户规模扩张受限
  18. 小朱的Java学习之旅--出发
  19. 室外管线lisp_LISP编程在管线制图中的开发应用
  20. Python:实现comb sort梳状排序算法(附完整源码)

热门文章

  1. 通过ethtool命令解决网络的卡顿、时延、断断续续、路由带*****识别错误
  2. python图片分析中央气象台降水量预报_获取中央气象台网的气象数据 全流程技术解析(python 爬虫)...
  3. Windows7/10耳机插入前面板没反应的解决方案
  4. python字符加密2pta_ptapython答案
  5. hdu 4607 Park Visit(树上最长链)
  6. element-ui Input 标签后加搜索图标
  7. 王者荣耀转系统服务器繁忙,换手机党的福音,王者荣耀开启跨系统角色转移,但这些问题要注意...
  8. RealView® 编译工具 汇编器指南
  9. MySQL数据库的锁 --- 六种分类 - 14种锁详细介绍
  10. RCNN、Fast RCNN、Faster RCNN算法详细介绍