最推荐用 std::fill(arr, arr + size, 0) 清零 int 数组,类型安全、跨平台、适用于栈/堆;避免 arr = {0}(非赋值)和 memset(语义不清、类型不安全)。

用 std::fill 清空已定义的 int 数组
“清空”对原生数组没有标准语义,实际是指把所有元素重置为 0。最直接安全的方式是用 std::fill,它不依赖初始化方式,也不要求数组在栈上或堆上。
常见错误是写 arr = {0} 或 memset(arr, 0, sizeof(arr)) —— 前者只对局部数组声明有效(不是赋值),后者在跨平台或含 padding 的结构体中易出错,且对 int 虽然凑巧能用,但语义不清、类型不安全。
-
std::fill(arr, arr + size, 0):推荐,类型安全,编译器可优化,适用于栈/堆数组 - 若用
std::vector<int></int>,直接调v.assign(v.size(), 0)或std::fill(v.begin(), v.end(), 0) - 别用
memset处理非char类型——虽然int是整数,但标准不保证全零比特等于0(实际绝大多数平台满足,但属未定义行为边缘)
声明时初始化为全 0 的三种写法及差异
声明阶段设初值比事后清空更高效,也更符合意图。但不同写法行为不同,尤其涉及全局/静态 vs 局部变量时。
-
int arr[10] = {}:显式聚合初始化,全部元素为0,无论作用域 -
int arr[10] = {0}:等价于上一条,首元素为0,其余隐式零初始化 -
int arr[10];(无初始化):局部变量值随机;全局/静态变量自动零初始化——这点常被忽略,导致调试时发现“有时清空有时没清空”
注意:int arr[10]{}(C++11 起支持)和 int arr[10] = {} 行为一致;但 int arr[10]{1} 只初始化第一个为 1,其余仍为 0,不是“填满 1”。
立即学习“C++免费学习笔记(深入)”;
std::array<int n></int> 的初始化与重置更可靠
原生数组缺乏类型安全和边界信息,std::array 是更现代、更可控的选择,尤其适合需要传参、泛型或避免退化为指针的场景。
- 声明即初始化:
std::array<int> arr = {};</int>→ 全0 - 运行时重置:
arr.fill(0);(成员函数,简洁明确) - 传给函数时不会退化为指针,大小信息保留,
sizeof和arr.size()都可用 - 性能无损:
std::array是零开销抽象,汇编输出和原生数组几乎一致
动态分配的 int* 数组怎么安全归零
用 new int[N] 分配的内存默认不初始化(值随机),必须手动处理。这里最容易踩的坑是混淆 delete 和 delete[],以及误以为 new int[N]() 中的括号可省略。
- 正确初始化:
int* p = new int[N]();—— 注意末尾(),表示值初始化(全0) - 运行时清零:
std::fill(p, p + N, 0)或std::memset(p, 0, N * sizeof(int))(此时可用,因目标是int且确定无 padding) - 千万别写
new int[N]后不初始化就直接用——UB 风险,尤其开启编译器优化后行为更难预测 - 优先考虑
std::vector<int>(N)</int>:构造时自动初始化为0,无需手动delete,异常安全
真正麻烦的从来不是“怎么写”,而是“在哪一刻该确保它是 0”——比如函数参数、类成员、多线程共享缓冲区。这些地方漏掉初始化,问题往往延迟暴露,排查成本远高于写一行 .fill(0)。










