1 变量的生存期和作用域
- 变量的储存方式:动态储存(自动、寄存器)、静态储存(静态和外部)
储存方式 | 名称 |
---|---|
自动变量 | anto |
寄存器变量 | register |
静态储存 | static |
外部变量 | extern |
- 基本类型的静态变量(static)系统初始值为 0,全局变量也会自动初始化0
extern
声明外部变量时,类型名可以写也可以不写,如extern int A,B,C
,也可以写成extern A,B,C
,因为它不是定义变量,可以不指定类型,只需写出外部变量名即可。- 若希望某些外部变量只限于本文件引用,而不能被其他文件引用,可以在定义外部变量时加一个
static
声明,如static int A;
,那么在其他文件引用extern A
就会报错。 - 对局部变量声明
static
,作用是把它分配在静态内存,它在整个程序执行过程中不会被释放。对全局变量声明static
,则限定该变量作用域只限于本文件。 - 若要求函数只能被本文件内调用,称为内部函数,在定义内部函数时,加上
static
即可。 - 若要定义外部函数,加上
extern
即可,但C语言默认不加static
的就会外部函数,可以被其他文件调用。
Stack (栈内存):主要是用来存储 function calls(函数调用)和 local variables(局部变量) 的空间,其本质就是一个 Stack(栈)。最底层的便是
main()
函数,每调用一个函数时就会执行 push 操作,每当函数 return 时便执行 pop 操作。什么时候 main() 也被 pop 了,整个程序也就结束了。(如果这个 stack 变得太高以至于超出了最大内存地址,就会出现所谓的 stackoverflow)HEAP(堆内存):主要是用来存储由
malloc()
等申请的内存位置。如果malloc()
返回 null 的话就往往表示这一块空间已经用完了。Static (静态内存):这里的变量的生命周期与整个程序相同,即在进程创建是被申明,在程序退出时被销毁。global variables(全局作用域变量), file scope variables(文件作用域变量)和被 static 关键字修饰的变量会存在这里。
2 默认初始化规则(C++11)
- 栈中的变量(函数体中的自动变量)和堆中的变量(动态内存)会保有不确定的值;
- 全局变量(静态内存)和静态变量(包括局部静态变量,静态内存)会初始化为零。
C++11: If no initializer is specified for an object, the object is default-initialized; if no initialization is performed, an object with automatic or dynamic storage duration has indeterminate value. Note: Objects with static or thread storage duration are zero-initialized, see 3.6.2.