因为数组名作函数参数会退化为指针,sizeof 返回指针大小而非数组长度;用引用或 std::array 可保留大小信息,动态大小则需显式传长度或用 std::vector。

传数组时为什么 sizeof 失效了
因为 C++ 中数组名作为函数参数时,会自动退化为指针。哪怕你写 void f(int arr[10]),编译器实际看到的是 void f(int* arr),所以 sizeof(arr) 在函数内永远是指针大小(通常是 4 或 8),不是原数组字节数。
用引用传递固定大小数组最安全
如果数组大小在编译期已知,用引用能保留长度信息,避免退化:
template <size_t n>
void process(const int (&arr)[N]) {
std::cout int data[5] = {1,2,3,4,5};
process(data); // OK,N 推导为 5
</size_t>
- 不能传
new int[5]或 vector.data() —— 引用只绑定栈上或全局数组 - 类型和大小必须完全匹配,
int[5]和int[6]是不同类型 - 加
const&避免拷贝,也防止意外修改
用 std::array 替代裸数组更现代
std::array 是轻量封装,不退化、有 .size()、支持范围 for,传值或引用都行:
void handle(const std::array<int>& a) {
std::cout a = {1,2,3};
handle(a);
</int>
- 模板参数
<int n></int>中的N必须是编译期常量 - 比裸数组多一点类型安全,但零运行时开销
- 如果大小不确定,就别硬套
std::array,该用std::vector
动态大小只能靠额外传长度或用 std::vector
如果数组来自 new、C API 返回,或大小运行时才确定,裸数组只能配一个长度参数:
void parse(int* data, size_t len) {
for (size_t i = 0; i
- 绝不要在函数里对
data调用sizeof想“猜”长度 -
std::vector更推荐:传const std::vector<int>&</int>,直接用.size()和.data() - C 风格接口(如
read(fd, buf, count))必须严格配对长度,错一位就可能越界
真正容易被忽略的是:函数签名里写 int arr[] 或 int arr[100] 纯属自欺欺人——编译器根本不检查长度,连警告都不给。信这个不如信注释。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











