内存篇之程序内存布局

    程序内存布局是理解软件本质的基础要素。支持一个程序运行的所有内存大体可分为以下几部分,或者说程序运行需要系统为其提供如下几部分存储区域:

    栈:由编译器自动分配释放,存放函数参数,局部变量等,特点为后进先出。

    堆:程序员调用malloc/free进行内存动态分配和释放所操作的内存区域。

    全局数据区(静态区):全局变量以及static变量存放的内存区,注意static变量不管在哪里定义都存放在全局数据区(见C基础static篇)。初始化的全局和静态变量在全局初始化区,未初始化的全局和静态变量在全局未初始化区。整个全局数据区在程序结束后由系统释放。

    程序代码区:存放二进制的程序代码,一般规定为只读。

    常量区:里面存放常量,不能修改,如"adgf"这样的字符串就存放在常量区,一直占用到程序结束。

    不同编译器和系统的内存布局划分会有细小差别,但上述几大块基本跑不掉。它们是组成一个完整程序的内存基础,这里的程序指运行在没有OS的裸系统上的控制程序,比如单片机应用等,而引入OS后,单个进程所包含的元素也基本归于以上几类。下面举例说明C程序中不同元素在内存中的定位区域:

    int a = 0;    //全局初始化区

    char *p1;    //全局未初始化区

    void main()

    {

      int b;          //

      char s[] = "abc"; //s[]在栈上,abc在常量区

      char *p2;      //

      char *p3 = "12345"; // p3在栈上,12345在常量区。

      static int c =0 //全局(静态)初始化区

      p1 = (char *)malloc(10);

      p2 = (char *)malloc(20); //分配的1020字节内存块在堆里,而p1,p2本身在栈中

      strcpy(p1,"12345"); //12345在常量区,编译器会将它与p3所指的"12345"优化成一块

    }

    总结:函数体中定义的局部变量(非static)位于栈上;通过malloc,calloc等函数分配所得到的内存在堆上;所有全局变量以及static静态变量都放在全局数据区。程序自身指令位于只读代码区。常量位于常量区(有的也散列在代码区,因为都是只读属性,可以合并放在一起)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值