因为数组形参会退化为指针,sizeof(arr) 返回指针大小而非数组长度;必须显式传入长度参数才能正确获取数组元素个数。

为什么 sizeof 在函数内对形参数组返回的是指针大小
因为 C++ 中,**数组形参会自动退化为指针**,哪怕你写成 void func(int arr[10]),编译器实际看到的仍是 void func(int* arr)。所以 sizeof(arr) 拿到的是指针长度(通常是 4 或 8 字节),不是原始数组长度。
常见错误现象:sizeof(arr) 返回 8(64 位系统下指针大小),但你传入的是 int a[5],预期是 20,结果却是 8 —— 编译不报错,但逻辑彻底错。
- 函数签名里写
int arr[]、int arr[100]或int* arr,效果完全一样,都是指针 -
sizeof是编译期运算符,它只看变量声明类型,不查运行时内存布局 - 即使开启
-Wall或/W4,这个错误也不会被警告
怎么让函数“知道”数组长度
必须显式传入长度,这是最直接、最通用的做法。C 风格函数(如 memcpy、qsort)都这么干。
void process(int arr[], size_t len) {
for (size_t i = 0; i
- 别依赖
sizeof在函数内算长度,永远传len -
std::size是 C++17 引入的安全封装,比手写sizeof(arr)/sizeof(arr[0])更可靠(支持容器) - 如果只处理栈上数组且不想改接口,可改用引用形式(见下一条)
用数组引用避免退化(限编译期已知长度)
如果数组长度在编译期固定,可以用模板 + 引用方式保留尺寸信息,此时 sizeof 才真正有效。
new int[5]
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











