静态存储期数组未显式初始化时自动零初始化,但显式写={}最可靠;static局部数组仅首次进入作用域时零初始化,后续调用保持值;std::array初始化行为更安全明确。

静态数组定义时直接用花括号初始化
全局或静态作用域下的 int 数组,只要在定义时写 {} 或 {0},编译器就会自动把所有元素设为 0。这不是“语法糖”,而是 C++ 标准规定的零初始化行为。
常见错误是只写 int arr[10]; —— 这在函数内是未定义值,在全局/静态作用域下才隐式零初始化,但显式写出更可靠、意图更清晰。
-
static int arr[5] = {};→ 全部为 0 -
int arr[5] = {0};→ 首元素为 0,其余由编译器补 0(等效) -
int arr[5] = {1};→arr[0]是 1,arr[1..4]是 0(注意不是全 1)
局部栈上静态数组不能靠 static 关键字“变零”
有人误以为在函数里写 static int arr[10]; 就能每次调用都“重置为 0”,这是错的。static 在这里只影响生命周期(只初始化一次),不改变初始化方式:如果没显式初始化,它只在**第一次进入作用域时做零初始化**,之后再进函数,数组值保持上次修改结果。
想每次调用都清零,得手动赋值:
立即学习“C++免费学习笔记(深入)”;
- 用
std::fill(arr, arr + 10, 0); - 或循环
for (int& x : arr) x = 0; - 避免用
memset(arr, 0, sizeof(arr));处理非char类型——虽对int常见平台有效,但不符合类型安全原则
用 std::array 更安全且初始化行为一致
std::array<int></int> 的默认构造和 {} 初始化也触发零初始化,且语义更明确,还能配合 std::fill、范围 for 等现代用法。
示例:
std::array<int, 3> a = {}; // 全 0
std::array<int, 3> b{0}; // 同样全 0
注意:不能写 std::array<int> c = {1};</int>,这会编译失败(聚合初始化要求元素数匹配),反而帮你避开 int arr[]{1} 那种易错写法。
别混淆 new int[N] 和静态数组初始化
动态分配的 int* 不会自动归零:new int[10] 返回未初始化内存;要零初始化得用 new int[10]()(带空括号)。
但这和“静态数组”无关——标题里的“静态”指存储期(static storage duration),不是 static 关键字,也不是“栈数组 vs 堆数组”的区分。很多人卡在这层术语混淆上。
真正要注意的点只有一个:只要变量有静态存储期(全局、命名空间级、static 局部变量),且声明时没提供初始化器,C++ 就保证它被零初始化;但显式写 = {} 是最直白、无歧义的做法。


















