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.
本文深入探讨了C++中变量的储存方式、生存期、作用域及默认初始化规则,详细解析了动态储存、静态储存的特性,以及C++11中对全局变量和局部静态变量的初始化规则。
2348

被折叠的 条评论
为什么被折叠?



