C语言程序内存分类

来源:互联网 发布:私人网络日记本哪个好 编辑:程序博客网 时间:2024/06/05 22:40

         1、栈(stack) ,由编译器负责自动分配与释放,一般在函数体类定义的局部变量与非main函数参数都放在栈内;其操作方式类似于数据结果中的栈。

栈又称堆栈, 是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进先出特点,所以栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。

      2、堆(heap),由程序员主动分配和释放,若程序员不释放,则只会在程序退出的时候被系统释放,用malloc、calloc、realloc等函数申请到的内存区域放在堆上,需要使用free函数释放相应内存,否则只有在程序退出时才会被系统所回收;
       堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)。

        3、全局/静态存储区,专门存放全局变量和静态变量的区域,它还可以再细分为两个区域,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和静态变量在相邻的另一块区域, 程序退出时才释放,例如在函数体外定义的全局变量和static修饰的变量;
       数据段(data):存放的是全局变量、静态变量、常数。根据存放的数据,数据段又可以分为普通数据段(包括可读可写/只读数据段,存放静态初始化的全局变量或常量)、BSS数据段(存放未初始化的全局变量)。在采用段式内存管理的架构中,BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。 程序结束后由系统释放

        4、常量存储区,专门用于存放常量的区域, 程序退出时才释放,例如形如“cpplive”之类的字符串。 

     和数据结构中的堆、栈区别,参考:http://www.51testing.com/?uid-410671-action-viewspace-itemid-837452

example:#include <stdio.h>int a = 0;                                      /*可读可写数据段*/int b;                                             /*BSS段*/char *p1;                                     /*BSS段*/int main(int argc, char *argv[]) /*main函数在代码段*/{  int c;                              /*在栈*/char s[]="abc";              /*s在栈,“abc”在常量区*/char *p2;                       /*p2在栈*/char *p3='123456';   /"123456"在常量区,p3在栈*/static int c=0;             /*可读可写数据段,全局(静态)初始化区*/ p1=(char *)malloc(10);/* 分配得来的10个字节的区域在堆区*/p2=(char *)malloc(20);/*分配得来的20个字节的区域在堆区 *//* 从常量区的''Hello World*字符串复制到刚分配的堆区*/strcpy(p1,"Hello World"); char *d;                    d = malloc(100);    /*d在堆*/  printf("%d %d %d\n",a,b,c);  free(d);  return 0;}
int a = 0; //全局初始化区char *p1; //全局未初始化区void main() {     int b; //栈     char s[] = "abc"; //栈     char *p2; //栈     char *p3 = "123456"; //“123456”存放在常量区,p3存放在栈上     static int c = 0; //全局(静态)初始化区     p1 = (char *)malloc(10); //申请10字节的内存区分配在堆区     p2 = (char *)malloc(20); //申请20字节的内存区分配在堆区     strcpy(p1, "123456");      //”123456”存放在常量区,编译器可能会将它与p3所指向的"123456"优化成一块}

参考链接:http://www.cpplive.com/html/537.html

                   http://hi.baidu.com/chinawei97/item/b797046bfdd31d2168105b4c