zoukankan      html  css  js  c++  java
  • 20深入理解C指针之---程序的栈和堆

      一、程序在内存中的存储分段:



        程序段主要包括:code段、data段、内核段、堆段和栈段

        1、code段:

          1)、存储程序汇编后程序指令

          2)、此段中的数据是只读的

          3)、不能用于存储变量,可以存储常量

          4)、有固定的大小

        2、data段包括data段和bss段:

          1)、data段主要存储全局变量      

          2)、data段主要存储静态变量      

          3)、data段主要存储已初始化变量

          4)、data段主要存储字符串及其他变量

          5)、data段可以改写,有固定大小

          6)、bss段主要存储未初始化变量

          7)、bss段可以改写,有固定大小

        3、内核段:

          1)、一般用户不能读写      

          2)、处在内存地址空间的最高端      

          3)、涉及到地址,会出现段错误

        4、堆段:

          1)、人工申请分配,易出现内存泄露情况      

          2)、堆内存空间几乎不受任何限制,只与物理内存大小有关      

          3)、频繁分配与释放内存,易产生内存碎片

          4)、向着内存地址增加的方向增长      

          5)、只能动态分配,效率较低      

          6)、堆中的利用的内存是不连续的内存分布 

        5、栈段:

          1)、编译器自动分配      

          2)、栈空间的大小有严格要求      

          3)、不存在内存碎片问题

          4)、向着内存地址减小的方向增长      

          5)、底层支持,可静态或动态分配,效率较高      

          6)、栈中的利用的内存是连续的内存分布 

        6、堆段和栈段的共同点:

          1)、都不能越界访问      

          2)、通常说的堆栈主要指栈段      

          3)、手工分配内存是,堆比栈的使用更加灵活

        程序使用空间的总结:

          1)、自动变量存储在函数的栈帧上,在编译时完成内存分配,主要有局部变量或函数参数等      

          2)、静态或全局变量在程序的数据段      

          3)、数据段处于执行代码和系统管理的其他区域上

          4)、使用函数分配时使用堆空间,堆上的空间需要手动释放      

  • 相关阅读:
    bzoj 1015: [JSOI2008]星球大战starwar【并查集】
    bzoj 1026: [SCOI2009]windy数【数位dp】
    bzoj 3231: [Sdoi2008]递归数列【矩阵乘法】
    bzoj 4198: [Noi2015]荷马史诗【哈夫曼树+贪心】
    bzoj 1093: [ZJOI2007]最大半连通子图【tarjan+拓扑排序+dp】
    bzoj 3209: 花神的数论题【数位dp】
    bzoj [JSOI2010]Group 部落划分 Group【二分+并查集】
    bzoj 1087: [SCOI2005]互不侵犯King【状压dp】
    bzoj 2730: [HNOI2012]矿场搭建【tarjan】
    bzoj 1878: [SDOI2009]HH的项链【树状数组】
  • 原文地址:https://www.cnblogs.com/guochaoxxl/p/6960836.html
Copyright © 2011-2022 走看看