生命周期和作用域的概念
生命周期:变量的创建到变量的销毁之间的一个时间段,或者说一个变量存在的周期。
作用域:一个变量可以被引用的范围。通常来说,一段程序代码中所用到的名字并不总是有效/可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。
存储区
要理解C/C++中各种变量的作用域和生命周期,必须结合C/C++的内存管理。详情见链接: https://blog.csdn.net/u011616739/article/details/61621815.
需要注意的是一个C/C++程序通常占用的内存分为以下几个部分(由高地址到低地址排列):
- 栈区:存放函数、局部变量、return值。由编译器自动分配;
- 堆区:通常由程序员分配(malloc),释放(free);
- 全局区(静态区):一、全局变量和静态变量是在一起存放的,二、初始化的全局和静态变量存放在data段,而未初始化的部分存放在bss段,三、一旦分配,直到程序结束才有系统自动释放;
- 常量区:常量字符串存放位置,程序结束后由系统释放;
- 代码区:二进制代码存放位置。
全局变量、静态变量、局部变量的生命周期、作用域
- 全局变量
存储在静态存储区,作用于全局(所有源文件都可引用,其他文件如果要使用,必须用extern 关键字声明),其生命周期贯穿整个程序。 - 全局静态变量
由static关键字,const关键字定义,同样存储在静态存储区,作用于全局(只作用于当前被定义的文件),其生命周期贯穿整个程序。 - 静态局部变量
局部static定义,同样存储在静态存储区,只在局部作用于可见,生命周期贯穿整个程序(超过其作用域便无法被引用)。 - 局部变量
存储在栈区,只被初始化一次(多线程中需要加锁保护),程序运行处局部,进入作用域生命周期开始,出作用域生命周期结束。
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;
}