面试题答案
一键面试全局变量
- 存储位置:存储在全局数据区(静态存储区)。
- 生命周期:从程序启动开始,到程序结束时销毁。
- 访问控制:在整个程序的所有文件中都可以访问(需注意作用域规则,若在某个源文件中定义为
static
,则只能在该源文件内访问)。 - 多线程问题:多个线程可能同时访问和修改全局变量,容易引发竞态条件,导致数据不一致问题。通常需要使用同步机制(如互斥锁)来保护对全局变量的访问。
局部变量
- 存储位置:一般存储在栈上(动态存储区),对于函数内的对象,会在栈上分配空间。但如果局部变量是用
new
动态分配的,那么它存储在堆上。 - 生命周期:从变量声明处开始,到所在代码块结束时销毁。函数调用结束,局部变量在栈上的空间会被释放。
- 访问控制:只能在声明它的代码块内访问。
- 多线程问题:每个线程都有自己独立的栈空间,因此局部变量在线程间是隔离的,一般不会出现多线程访问冲突问题。不过,若局部变量指向了共享资源(如通过
new
分配在堆上的内存),依然可能产生竞态条件。
静态局部变量
- 存储位置:存储在全局数据区(静态存储区),和全局变量类似。
- 生命周期:从第一次执行到其声明语句开始,直到程序结束时销毁。即使所在函数多次调用,静态局部变量的值也会保持上次调用结束时的值。
- 访问控制:只能在声明它的函数内访问,具有函数作用域。
- 多线程问题:由于静态局部变量存储在全局数据区,多个线程可能同时访问和修改它,同样可能引发竞态条件,需要同步机制来保护。