最稳妥重置short数组用std::fill,如std::fill(arr, arr + 100, static_cast(0));它按元素赋值,避免memset因字节长度误算导致的越界或漏清,且兼容栈/堆/容器data()。

用 std::fill 最稳妥地重置 short 数组
直接对 short 数组赋 0,最常用也最不容易出错的方式就是 std::fill。它不关心底层类型大小,只按元素逐个赋值,避免了字节级操作可能引发的符号位或对齐问题。
- 适用于栈上数组、堆上
new short[n]、std::vector<short></short>的data() - 比
memset更安全:后者按字节清零,若short是 2 字节,memset(p, 0, n)若传错长度(比如传了元素个数而非字节数),就会越界或漏清 - 示例:
short arr[100]; std::fill(arr, arr + 100, static_cast<short>(0));
memset 能不能用?能,但参数必须算准
可以,但极易踩坑——memset 操作的是字节,不是元素。对 short 数组误传元素个数,等于只清了前半部分内存。
- 正确写法:
memset(arr, 0, sizeof(short) * n),其中n是元素个数 - 常见错误:
memset(arr, 0, n)(传了n而非字节数),尤其当n来自模板参数或宏时容易忽略 - 在严格别名(strict aliasing)场景下,
memset对short*的行为是定义良好的,但不如std::fill直观
构造时初始化比运行时重置更省事
如果数组生命周期内只需“一开始就是 0”,优先在定义时初始化,省去后续清零步骤,也避免忘记调用。
- 栈数组:
short arr[100] = {};或short arr[100] = {0};都会零初始化 - 堆分配:
short* p = new short[100]();(带空括号才会零初始化;new short[100]不初始化) -
std::vector<short></short>构造时默认就填 0:std::vector<short> v(100);</short>
用 std::array 或 std::vector 时别手写循环清零
现代 C++ 容器自带语义清晰的清零方式,手写 for 循环既啰嗦又易错。
立即学习“C++免费学习笔记(深入)”;
-
std::array<short> a; a.fill(0);</short>—— 简洁、内联、无开销 -
std::vector<short> v(100); v.assign(v.size(), 0);</short>或直接v.clear(); v.resize(100);(后者更高效,因为复用内存) - 避免:
for (auto& x : v) x = 0;—— 可读性尚可,但编译器未必能优化成memset,且不如assign或fill表达意图明确
真正容易被忽略的是:short 是有符号类型,清零本身没陷阱,但如果你之后做位运算或 memcpy 到其他类型(比如当成 unsigned short 或 char[2] 处理),得确认平台字节序和符号扩展逻辑是否一致——这时候清零只是起点,后续解释才决定结果。








