C++怎么获取数组长度 C++ sizeof计算数组元素个数方法【计算】

8次阅读

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

C++怎么获取数组长度 C++ sizeof计算数组元素个数方法【计算】

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::array arr = {1,2,3,4,5}; std::cout << arr.size(); // 输出 5,永远可靠
  • 编译期确定大小,零开销,和 C 风格数组内存布局一致
  • 可直接传递给函数,.size() 始终有效,不依赖 sizeof
  • 如果需要兼容旧代码,可以用 arr.data() 获取原始指针

模板推导 + sizeof 是唯一安全的“自动算长度”技巧

仅当数组是**模板参数**时,编译器能推导出完整类型(含长度),此时 sizeof 才真正可用。

示例:

立即学习C++免费学习笔记(深入)”;

template constexpr 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 字节),跟它存了多少元素无关
  • sizeofvector 完全没用,别试
  • 动态数组场景(大小不确定),必须用 vector 或手动传长度,没有银弹

c++ 里“获取数组长度”这件事,本质上是在区分「编译期已知大小」和「运行时才确定大小」。一旦脱离定义作用域,sizeof 就不可信;而模板推导或 std::array 这类机制,才是把“长度”真正绑定到类型上的正解。

text=ZqhQzanResources