用 sizeof 计算数组长度仅在定义作用域内有效,因函数参数会退化为指针;推荐优先使用 std::size,或模板 constexpr Array_size 获取编译期长度。

用 sizeof 计算数组长度时,必须确保传入的是原生数组而非指针
很多人写 sizeof(arr) / sizeof(arr[0]) 却得到错误结果,根本原因是:函数参数一旦声明为 T arr[] 或 T* arr,数组就退化为指针,sizeof 返回的是指针大小(通常是 8),而不是整个数组字节数。
正确做法是只在数组定义作用域内使用该技巧:
- ✅ 在定义处直接计算:
int arr[] = {1, 2, 3, 4};
size_t n = sizeof(arr) / sizeof(arr[0]); // 得到 4
- ❌ 不要在函数内对形参这么干:
void foo(int arr[]) {
size_t n = sizeof(arr) / sizeof(arr[0]); // 错!arr 是 int*,结果恒为 1(64 位下)
}
- ⚠️ 字符串字面量要注意结尾