zoukankan      html  css  js  c++  java
  • 程序的内存分配

    栈区(stack)

      由编译器自动分配释放,存放函数的参数值,局部变量的值等。其他操作类似于数据结构中的栈。

    堆区(heap)

      一般有程序员分配释放,若程序员不释放,程序结束后可能有OS回收。它和数据结构中的堆不是一回事,分配方式类似于链表。

    全局区(静态区static)

      全局变量和静态变量存储在之一区域,初始化的全局变量和静态变量在这一区域,未初始化的全局变量和未初始化的静态变量在相邻的另一区域。程序结束后由系统释放。

    文字常量区

      常量字符串存放在这一区域。程序结束后由系统释放。

    程序代码区

      存放函数体的二进制代码。

    进程内存分配图

    高地址

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    低地址

    段区名

    解释

    内容

    stack

    栈:局部变量

    1、在函数内部定义的局部变量(非static型)

    2、中断发生时存放的运行环境

    room

    增长空间:堆向上长,栈向下长

    堆和栈动态变化的空间,

    1、堆从低地址向上动态增长

    2、栈从高地址向下动态增长

    heap

    堆:动态分配的内存空间

    1、程序运行时动态分配的空间,如malloc函数,new等

    2、动态释放,如free函数,delete等

    other

    其他

    .bss

    未初始化的全局变量区

    函数外部定义的(全局变量),如

    1、   int I;

    2、   static int j;

    .data

    已初始化的全局变量区

    1、函数外定义的:static int i = 0;

    2、函数内部定义的:static int j;//编译器自动初始化为0

    .text

    可执行文件

    1、程序代码,即当前CPU的二进制机器码

    2、常量,如const char msg[]=”hello world ”

    注:

      1、单片机,可执行文件一般没必要加载到内存中,也就不存在.text段。

      2、对于多任务系统来说,一个进程的内存分配往往是动态的,因此堆区实际地址空间可能不连续。

      3、栈区作为存放局部变量的区域,往往可以设置其最大大小,运行时超出定义大小则会产生越界错误(段错误的一种)。

             unix系统进程内存占用示意图

    参考:

      https://blog.csdn.net/hitman_cs/article/details/70599071

      https://blog.csdn.net/qq792326645/article/details/49783347

  • 相关阅读:
    poj1904 King's Quest
    ACM竞赛须掌握的知识 以及 2个版本的POJ推荐 @ NKOJ discuss 转载的
    poj1466
    C++23中设计模式的factory模式
    poj3667 hotel
    poj1505 Copying Books
    在linux系统中安装VSCode(Visual Studio Code)
    Spring_的jar详细说明
    java开发问题总结4Maven使用问题汇总
    线程同步之信号量(sem_init,sem_post,sem_wait)
  • 原文地址:https://www.cnblogs.com/coolYuan/p/9228719.html
Copyright © 2011-2022 走看看