C语言-变量生存期及作用域
目录
- 1 变量的生存期和作用域
- 2 默认初始化规则(C++11)
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语言-运算符优先级及注意事项
- 下一篇: C语言-动态内存分配总结