sizeof不能直接用于函数参数中的数组,因数组传参会退化为指针,sizeof返回指针大小而非原数组字节数;仅在定义数组的作用域内(如全局或局部定义处)可安全使用sizeof;推荐用std::array替代,其保留长度信息且支持.size()。

sizeof 不能直接用于函数参数中的数组
在函数内部用 sizeof 算数组长度,几乎总是错的。因为数组作为参数传入时会退化为指针,sizeof(arr) 返回的是指针大小(通常是 4 或 8),不是原数组总字节数。
常见错误现象:sizeof(arr) / sizeof(arr[0]) 在函数里返回 1(32 位)或 1(64 位),而不是你期望的元素个数。
- 只在**定义数组的作用域内**(比如全局、局部变量定义处)才能安全使用
sizeof - 函数形参写成
int arr[]或int* arr效果一样,都丢失长度信息 - 若必须传数组长度,老老实实加一个
size_t len参数
std::array 是最稳妥的替代方案
std::array 是栈上固定大小容器,保留了长度信息,且支持 .size() 成员函数,类型安全、无退化问题。
示例:
立即学习“C++免费学习笔记(深入)”;
std::arrayarr = {1,2,3,4,5}; std::cout << arr.size(); // 输出 5,永远可靠
- 编译期确定大小,零开销,和 C 风格数组内存布局一致
- 可直接传递给函数,
.size()始终有效,不依赖sizeof - 如果需要兼容旧代码,可以用
arr.data()获取原始指针
模板推导 + sizeof 是唯一安全的“自动算长度”技巧
仅当数组是**模板参数**时,编译器能推导出完整类型(含长度),此时 sizeof 才真正可用。
示例:
立即学习“C++免费学习笔记(深入)”;
templateconstexpr size_t array_size(T (&)[N]) { return N; } // 调用:int a[10]; array_size(a); // 返回 10
- 函数参数必须是引用形式
T (&)[N],不能是T [N]或T* - 这个技巧本质是让数组长度成为模板非类型参数,由编译器捕获
- 无法用于动态分配数组(如
new int[10])或函数参数中已退化的数组
vector.size() 和 sizeof 的根本区别
std::vector 的 .size() 返回运行时实际元素个数;而 sizeof 计算的是编译期已知的**内存占用字节数**,两者语义完全不同。
-
sizeof(std::vector永远是固定值(通常 24 字节),跟它存了多少元素无关) -
sizeof对vector完全没用,别试 - 动态数组场景(大小不确定),必须用
vector或手动传长度,没有银弹
C++ 里“获取数组长度”这件事,本质上是在区分「编译期已知大小」和「运行时才确定大小」。一旦脱离定义作用域,sizeof 就不可信;而模板推导或 std::array 这类机制,才是把“长度”真正绑定到类型上的正解。










