美文网首页
C语言 内存分配

C语言 内存分配

作者: sirius_ztz | 来源:发表于2017-12-07 15:36 被阅读0次

    在C语言中,地址的由低到高基本由如下5个存储区组成:

    1. 正文区(Code or Text)
      名字有很多,有的称为代码段,代码区等等。但是实质都是一样的,都是用来存放程序编译后形成的机器代码。一般此内存区是只读的,防止程序意外修改指令。
    2. 初始化数据段(RO/RW data segment)
      程序一经编译好,该区域便存在,又被称为数据区。该区包含了3种数据:1、在程序中明确被初始化的全局变量(int a=2);2、静态变量(包括全局静态变量和局部静态变量);3、常量数据(如字符串常量)
    3. 未初始化数据段(BSS = Block Started by Symbol)
      这段储存的数据是:在程序中声明但是没有初始化的变量,如全局变量(int a;)这些变量在程序运行之前是不需要占用存储空间的.BSS段也属于静态内存分配,也可存放static申明的变量。
    4. 堆(heap)
      堆内存只在程序运行时出现,一般由程序员手动分配和释放,一般可以使用malloc()/nalloc() & free() 函数来申请、释放。在操作系统下,如果程序员没释放,一般操作系统可以在程序结束后回收内存
    5. 栈(stack)
      存放程序的局部变量(但不包括static声明的变量)。除此以外,在函数被调用时,栈用来传递参数和返回值。

    我们来通过例子具体看看一个程序在内存的存放,一个a.c文件通过编译后会生成执行文件a.out

    源文件在out文件种对应的部分 在例子中pear[40]和static double peach这两个变量就是放在BBS里面的,因为只是申明了他们但并没有初始化。而像初始化的mango和melon就是放在数据段里面的(又称静态区)。对于局部变量来说,他们要程序运行时才会在栈里面被创建 out文件在运行时对应的内存分配

    我们再通过一个程序的例子来分析里面每个变量的存放情况:

    int a = 0;    //a在全局已初始化数据区(Data区)
    char *p1;    //p1在BSS区(未初始化全局变量) 
    Define Pi 3.14 //常量,在Data区
    main() 
    {
    int b;    //b在栈区
    char s[] = "abc"; //s为数组变量,存储在栈区,"abc"为字符串常量,存储在已初始化数据区
    char *p1,p2;  //p1、p2在栈区
    char *p3 = "123456"; //123456\0在已初始化数据区,p3在栈区 
    static int c =0;  //c为全局静态变量,存在于已初始化数据区,静态数据会自动初始化
    p1 = (char *)malloc(10);//分配得来的10个字节的区域在堆区
    p2 = (char *)malloc(20);//分配得来的20个字节的区域在堆区
    free(p1);
    free(p2);
    }
    

    注意:上面的“abc”是属于常量,它和s[]是分开存的

    相关文章

      网友评论

          本文标题:C语言 内存分配

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