美文网首页
内存中的分区

内存中的分区

作者: charlotte2018 | 来源:发表于2017-07-24 10:54 被阅读18次

    先看下如下代码

    int a = 0; //全局初始化区
    char *p1; //全局未初始化区
    main()
    { 
        int b; //栈
        char s[] = "abc"; //栈
        char *p2; //栈
        char *p3 = "123456"; //123456\0在常量区,p3在栈上
        static int c =0; //全局(静态)初始化区
        p1 = (char *)malloc(10); //堆
        p2 = (char *)malloc(20);  //堆
    }
    
    

    再看看下面的图

    1609713-eaa6e0729938352f.jpg

    栈区

    由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。

    堆区

    一般由程序员分配释放, 若程序员不释放,程序结束时可能由操作系统回收。平时iOS中new对象都是创建在堆上的。

    可读可写区(.data .bss)

    可读可写区(全局区)(静态区)其实都是一个意思,存放全局变量和静态变量的。

    .data段

    一些全局或者静态的,且经过定义初始化过的变量,就属于该段;例如下面代码中的a,指针p以及b三个变量:

    int a = 2;
    int *p = &a;
    
    int main () 
    {
        static int b = 1;
    ...
    ...
        return 0;
    }
    
    .bss段

    一些全局或者静态的,且未经过初始化的变量,属于.bss段。例如上文中.data段段的三个变量,如果不进行初始化,就会存储在本段中.

    只读区(常量区)

    .text段

    真正组成程序的机器指令则存放在.text段中。一般情况下,在.text段中不进行数据项的定义。.text段包含名为标号的符号,这些符号用于标识跳转和调用程序代码位置。

    常量

    常量如const修饰的常量,字符串常量,都放在这个区。

    理解了内存的分区之后,在我们后续的内存管理上,会理解的更深刻一些。

    相关文章

      网友评论

          本文标题:内存中的分区

          本文链接:https://www.haomeiwen.com/subject/zqovkxtx.html