C语言程序内存分类

         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

 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值