进程内存区域--栈,堆,代码区,全局(静态)区 ,常量区

 

一个进程在内存中有5个区域
  1. 程序代码区
    用于存放程序代码,程序员一般不用关心。

  2. 文字常量区
    一般定义字符串时,字符串内容是在文字常量区的:
    char* s = "hello, world";  //指针s指向内存中的常量区的"hello, world"


  3. 全局(静态)存储区
    全局变量,静态(static)变量是一起的,都放在全局(静态)存储区,全局(静态)存储区中存放的数据会一直保存直到被新的数据覆盖或者进程退出。

  以上3部分的内存分配,在编译时就已经完成。

  4. 栈
    局部变量、函数参数、函数入口地址等存放于栈中。主要是存放临时性数据,变量的有效性会随着程序的运行而改变,例如退出函数以后,函数中的局部变量就会被‘踢出’栈中。linux系统默认栈大小为8M。

  5. 堆
    程序员用malloc系列函数申请出来的内存就是在堆里的,堆于栈相比,堆的可用大小相对不受限制(如果连续内存不够,也会失败),堆中数据的有效周期直到主动调用free()函数或者进程结束。  

  总之:如果要想实现数据的较长期储存,可以放在全局(静态)存储区和堆,下次访问时仍然可以取到上次运行的结果。

  

  下面分析一段代码:

    #include <stdio.h>

    char c='A'; //全局变量c储存于全局(静态)区

    static int m; //静态全局变量m储存于全局(静态)区

    int main(int argc, char *argv[])

    {
      int a; //变量a储存于栈中

      static int k=1; //静态局部变量k储存于全局(静态)区

      char *p = "hello~"; //指针变量p储存于栈中,指向常量区的字符串"hello~"

      char *s = (char *)malloc(sizeof(char) * 10); //指针变量s指向堆中的一块大小为10字节的内存位置

      if (s) 

      {

        ......

      }

      ......
    }

 

  

posted @ 2013-05-08 18:40  反光镜的博客  阅读(777)  评论(0编辑  收藏  举报