局部数组不初始化时内容为栈上随机值,读取未初始化元素导致未定义行为;全局/静态数组则自动零初始化,这是C++标准对静态存储期对象的规定。

定义局部数组时不初始化会怎样
在函数内部定义的 int arr[5] 这类局部数组,如果不显式初始化,编译器不会填零,内容是栈上残留的随机值。直接读取未初始化元素会导致未定义行为,比如 arr[0] 可能是任意整数。
- 想留空但避免垃圾值?必须显式写
int arr[5] = {}或int arr[5] = {0},二者都触发零初始化 - 用
int arr[5];定义后立刻用memset(arr, 0, sizeof(arr))也行,但不如初始化简洁 - 别依赖“好像每次都是 0”——这是巧合,不是保证
全局/静态数组不初始化默认为零
定义在函数外或加了 static 的数组,比如 static int arr[5]; 或 int global_arr[10];,即使不写 = {},编译器也会自动零初始化。这是 C++ 标准规定的“静态存储期对象”的行为。
- 这个规则对
int、double、指针等内置类型有效;对自定义类,会调用默认构造函数(如果存在) - 注意:
static int arr[5] = {1};是合法的,此时只有arr[0]是 1,其余仍被零填充 - 不要误以为局部数组也有这待遇——它没有
用 std::vector 替代原始数组更安全
如果目标是“定义时不指定初始值,但后续再赋值”,std::vector 比原始数组更符合直觉。例如 std::vector<int> v(5)</int> 创建含 5 个零的 vector;而 std::vector<int> v</int> 就是空容器,真正按需分配。
-
std::vector<int> v(5);</int>→ 大小为 5,全部初始化为 0 -
std::vector<int> v(5, -1);</int>→ 大小为 5,每个元素是 -1 -
std::vector<int> v;</int>→ 大小为 0,不占空间,之后可用v.resize(5)或v.push_back() - 原始数组大小必须编译期确定,
vector支持运行时决定,灵活性高得多
初始化列表省略部分元素的陷阱
写 int arr[5] = {1, 2}; 看似“只初始化前两个”,其实 C++ 规定:剩余元素会被零初始化。但这只适用于有初始化列表的情况;没写任何 = 就完全是另一回事。
立即学习“C++免费学习笔记(深入)”;
-
int arr[5] = {1, 2};→arr[0]=1,arr[1]=2,arr[2..4]=0 -
int arr[5] = {0};→ 全为 0(不是只设第一个) -
int arr[5];→ 完全不初始化,和上面两条无关 - 结构体数组同理:
struct S {int a; double b;} sa[2] = {};才能确保全部成员归零


















