C/C++中的变量存储类别以及内存分配

1. 变量的存储类别

        从变量值存在的角度来分,可以分为静态存储方式和动态存储方式。所谓静态存储方式指在程序运行期间由系统分配固定的存储空间的方式(程序开始执行时分配,在程序完毕时释放,在程序过程中它们占据国定的存储单元,而不是动态分配和释放)。而动态存储方式在运行期间根据需要进行动态存储方式(在程序过程中申请和释放的一些空间)。内存中供用户使用的存储空间分为:程序区、静态存储区和动态存储区。程序放在程序区,数据放在静态存储区和动态存储区。在动态存储区存放函数形式参数、自动变量(未加static声明的局部变量)和函数调用时的现场保护和返回地址。

C语言中每一个变量和函数两个属性:数据类型和数据的存储类别。存储方式分为两大类:静态存储和动态存储。具体保护:自动的(auto)、静态的(static)、寄存器的(register)、外部的(extern)。下面分别对上面关键字进行说明。

      (1)auto:这个关键字是默认的,这个关键字属于动态存储区,声明时不进行默认初始化。

      (2)static:如果希望局部变量调用结束后不消失保留此值(即加上改关键字在静态区分配空间存储),有默认初值。静态局部变量在编译时赋初值(即赋初值一次),以后每次运行保留上次的结果。如果是全局变量加上static时,就表示该变量的作用域只限于本模块。(全局变量默认存储在静态存储区)。同样,在多文件中为了防止名字冲突也可以将函数声明为static,这样只在文件内部引用

     (3)register一般情况下变量时存在内存中,程序用到变量时发出指令将内存中的该变量送到运算器中,经过运算,再存储到内种。这样如果频繁的使用某变量就将其定义为register类型(自由局部自动变量和函数形式参数),直接放在CPU中,提高效率。(一般的编译器为用户考虑这个问题,一般不需要考虑)

      (4)extern:用来声明外部变量和外部函数(和static一种用法相对),extern只是声明而不是定义。两种情况:同一文件中声明extern(表示变量定义在当前引用的后面);多文件中声明外部变量(表示该变量定义在文件外部)。函数声明也是如此(一般情况函数声明都没有extern,省略的)。

注:类具有封装性,所以类中的成员均不能使用关键字extern、auto或register限定其存储类型。

2. C语言内存分配机制

    (1)栈(Stack):位于函数内的局部变量(包括函数实参),由编译器负责分配释放,函数结束,栈变量失效。

    (2)堆(Heap):由程序员用malloc/calloc/realloc分配,free释放。如果程序员忘记free了,则会造成内存泄露,程序结束时该片内存会由OS回收,但程序只要不结束,就有可能造成内存泄露。(程序员负责分配和释放)

    (3)全局区/静态区(Global Static Area): 全局变量和静态变量存放区,程序一经编译好,该区域便存在。并且在C语言中初始化的全局变量和静态变量和未初始化的放在相邻的两个区域(在C++中,由于全局变量和静态变量编译器会给这些变量自动初始化赋值,所以没有区分了)。由于全局变量一直占据内存空间且不易维护,推荐少用。程序结束时释放。

    (4)C风格字符串常量存储区: 专门存放字符串常量的地方,程序结束时释放。

    (5)程序代码区:存放程序二进制代码的区域。

实例1:

int a = 0; //全局初始化区 
char *p1; //全局未初始化区(C++中则初始化为NULL)
int main() 
{ 
   int b;                  //b分配在栈上,整型 
   char s[] = "abc";      //s分配在栈上,char *类型;"abc\0"分配在栈上,运行时赋值,函数结束销毁
   char *p2;               //p2分配在栈上,未初始化 
   char *p3 = "123456";   //p3指向"123456"分配在字符串常量存储区的地址,编译时确定  p3存储在栈上
   static int c = 0;       //c在全局(静态)初始化区,可以多次跨函数调用而保持原值 
   p1 = (char *)malloc(10); //p1在全局未初始化区,指向分配得来得10字节的堆区地址 
   p2 = (char *)malloc(20); //p2指向分配得来得20字节的堆区地址
   strcpy(p1, "123456");   //"123456"放在字符串常量存储区,编译器可能会将它与p3所指向的"123456"优化成一块
   return 0;
}

3. C++语言内存分配机制

在C++语言中,与C类似,不过也有所不同,内存主要分为如下5个存储区:

    (1)栈(Stack):位于函数内的局部变量(包括函数实参),由编译器负责分配释放,函数结束,栈变量失效。

    (2)堆(Heap):这里与C不同的是,该堆是由new申请的内存,由delete或delete[]负责释放。

    (3)自由存储区(Free Storage):由程序员用malloc/calloc/realloc分配,free释放。如果程序员忘记free了,则会造成内存泄露,程序结束时该片内存会由OS回收。

    (4)全局区/静态区(Global Static Area): 全局变量和静态变量存放区,程序一经编译好,该区域便存在。在C++中,由于全局变量和静态变量编译器会给这些变量自动初始化赋值,所以没有区分了初始化变量和未初始化变量了。需要说明一点,全局静态变量和局部静态变量都是存储在同一个静态区(全局区),只是作用域不同。

    (5)常量存储区: 这是一块比较特殊的存储区,专门存储不能修改的常量(一般是const修饰的变量,或是一些常量字符串)。

转载自:http://blog.csdn.net/luyuncsd123/article/details/9079147
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值