变量的生命周期&作用域&存储

生命周期和作用域的概念

生命周期:变量的创建到变量的销毁之间的一个时间段,或者说一个变量存在的周期。
作用域:一个变量可以被引用的范围。通常来说,一段程序代码中所用到的名字并不总是有效/可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。

存储区

要理解C/C++中各种变量的作用域和生命周期,必须结合C/C++的内存管理。详情见链接: https://blog.csdn.net/u011616739/article/details/61621815.
需要注意的是一个C/C++程序通常占用的内存分为以下几个部分(由高地址到低地址排列):

  1. 栈区:存放函数、局部变量、return值。由编译器自动分配;
  2. 堆区:通常由程序员分配(malloc),释放(free);
  3. 全局区(静态区):一、全局变量和静态变量是在一起存放的,二、初始化的全局和静态变量存放在data段,而未初始化的部分存放在bss段,三、一旦分配,直到程序结束才有系统自动释放;
  4. 常量区:常量字符串存放位置,程序结束后由系统释放;
  5. 代码区:二进制代码存放位置。

全局变量、静态变量、局部变量的生命周期、作用域

  1. 全局变量
    存储在静态存储区,作用于全局(所有源文件都可引用,其他文件如果要使用,必须用extern 关键字声明),其生命周期贯穿整个程序。
  2. 全局静态变量
    由static关键字,const关键字定义,同样存储在静态存储区,作用于全局(只作用于当前被定义的文件),其生命周期贯穿整个程序。
  3. 静态局部变量
    局部static定义,同样存储在静态存储区,只在局部作用于可见,生命周期贯穿整个程序(超过其作用域便无法被引用)。
  4. 局部变量
    存储在栈区,只被初始化一次(多线程中需要加锁保护),程序运行处局部,进入作用域生命周期开始,出作用域生命周期结束。
static int c =  1;//全局初始化去(静态全局变量)
int a = 0; //全局初始化区(全局变量)
char  *p1; //全局未初始化区(全局变量)
 
int main(int argc, char const *argv[])
{
    int b;//存放于栈区(局部变量)
    char s[] = "abc";//s存放于栈区(局部变量)
    char *p2 ;//栈(局部变量)
    char *p3 = "123456";//p3存放于栈区(局部变量);“123456”存放区文字常量区
 
    static int c = 0;// c存放于全局初始化区(静态局部变量)
    p1 = (char *)malloc(10);
    p2 = (char *)malloc(20);//分配得来的10和20字节的区域在堆区;
                            //变量p1、p2指向堆区分配的内存
 
    strcpy(p1, "123456");//“123456”存放区文字常量区
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值