C++11起推荐用花括号初始化内置数组,编译器自动推导长度并支持零初始化和部分初始化;std::array更安全可控;new分配的数组需显式初始化;全局/静态数组默认零初始化,局部数组未定义。

用花括号初始化内置数组(C++11起最推荐)
直接在定义时用{}赋值,编译器会推导长度并逐个初始化,安全、简洁、支持零初始化和部分初始化。
-
int arr[] = {1, 2, 3};→ 长度为3,元素为1/2/3 -
int arr[5] = {0};→ 全部初始化为0(注意:只写一个0,其余自动补0) -
int arr[5] = {1};→arr[0]是1,arr[1]到arr[4]是0 - 若数量超过数组长度(如
int a[2] = {1,2,3};),编译报错too many initializers
用std::array替代C风格数组(更安全可控)
std::array是栈上固定大小容器,支持=赋值、迭代器、size()等,初始化方式和内置数组一致,但类型更明确、无退化风险。
-
std::array<int> a = {1, 2, 3};</int>→ 正确 -
std::array<int> b = {42};</int>→b[0]为42,其余为0 - 不能写
std::array<int> c = {1, 2};</int>(缺省值不自动补0,编译失败) - 若需运行时填值,用
fill():c.fill(0);
动态数组(new int[n])必须手动初始化
用new分配的内置类型数组**不会自动初始化**,内容是未定义的垃圾值,极易引发逻辑错误或崩溃。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
-
int* p = new int[5];→ 所有元素值随机,不可直接读取 - 加
()可零初始化:int* p = new int[5]();(注意括号不能少) - 用
std::vector更稳妥:std::vector<int> v(5, 0);</int>或std::vector<int> v{1,2,3};</int> - 忘记
delete[] p;会导致内存泄漏;建议优先用std::vector或智能指针
全局/静态数组默认零初始化,局部数组不保证
作用域决定初始化行为——这是最容易忽略的隐含规则。
立即学习“C++免费学习笔记(深入)”;
- 全局变量
int global_arr[3];→ 全为0(静态存储期,零初始化) - 函数内
static int static_arr[3];→ 同样全为0 - 函数内
int local_arr[3];→ 值未定义!哪怕看起来像“清空”,实际可能是任意位模式 - 别依赖调试器显示的“0”,那只是巧合;未初始化的局部数组读取属于未定义行为
很多问题其实就卡在局部数组没初始化,尤其在嵌入式或性能敏感场景里,开发者常误以为栈上变量“自然干净”。记住:只有静态存储期的数组才默认归零,其余都得亲手管。

















