问题的历史: 全局和静态变量在C语言中用于存储函数局部上下文以外的数据。它们的自动预初始化及在执行文件中特殊区域的放置优化了程序的运行,但同时,如果不理解这点,可能会导致行为不够明显。
问题: 重要的是要知道,在C语言中,全局和静态变量要么被明确指定的值初始化,要么自动初始化为零(零初始化)。初始化发生在main函数之前,这减少了访问未初始化数据的风险,但在特定条件下,会导致与多个模块的初始化和加载顺序相关的意外依赖。
解决方案:
代码示例:
#include <stdio.h> static int stat_var; int glob_var = 42; int main() { printf("static: %d, global: %d ", stat_var, glob_var); }
关键特点:
1. 是否可以依赖静态变量的隐式零初始化并认为这是一种安全的做法?
从技术上讲,这是可行的,但在大型项目中,最好明确初始化变量以提高可读性,防止编译器/链接器的可能更改。
2. 如果在外部函数中声明静态变量但未初始化,结果会是什么?
它仍然会被初始化为零:static int value; 在启动时始终为0。
3. 如果变量在单独的隔离模块中声明,并且使用了初始化器,何时会初始化全局变量?
初始化发生在调用main之前,但标准不保证不同模块之间的此类变量的初始化顺序,这可能导致在另一个模块的构造函数中访问未初始化的数据。
开发人员声明了静态变量以存储共享状态,假设它们总是会被明确初始化。
优点:
缺点:
在审查后,这些变量在声明时被明确初始化。
优点:
缺点: