sizeof算数组长度仅对栈上未退化的原生数组有效,因传参时数组会退化为指针导致失效;std::size(c++17起)是更安全的统一替代方案,支持原生数组、std::Array、std::vector等。

直接用 sizeof 算数组长度只在栈上原生数组有效
很多人一上来就写 sizeof(arr) / sizeof(arr[0]),结果在函数参数里失效——因为数组传参会退化为指针,sizeof 返回的是指针大小(通常是 8),不是原数组字节数。这招只对定义在当前作用域、未退化的栈数组管用:
-
int arr[5] = {1,2,3,4,5};→sizeof(arr)是 20(假设int为 4 字节) -
void foo(int a[]) { sizeof(a); }→ 这里a是int*,sizeof(a)恒为指针大小 - 全局数组、
Static数组也适用sizeof,但一旦取地址或作为参数传递,就不可靠
std::size(C++17 起)是更安全的替代方案
std::size 是标准库提供的函数模板,它对原生数组、std::array、std::vector 等容器都返回元素个数,且不依赖 sizeof 推导,因此不会在退化场景下出错: