为什么用指针向函数传递数组时,获取到的数组长度显示为1?
问题解答
结论
该现象属于正常情况,问题根源是C/C++中数组传参的退化特性,而非运行异常。
错误原因分析
- 当你把数组作为参数传入接收指针类型的函数时,数组会自动退化为指向数组首元素的普通指针,函数形参
int* a仅保存首地址,不携带任何数组长度信息。 - 函数内
sizeof(a) / sizeof(a[0])的计算逻辑完全错误:sizeof(a)求的是指针变量自身占用的内存大小(32位环境下为4字节、64位环境下为8字节),sizeof(a[0])是int类型的大小(通常为4字节),所以计算得到的n值仅为1(32位)或2(64位),远小于你预期的数组长度3,循环仅执行1次,自然只有第一个元素被修改为3。 - 对比main函数中同一句计算是正确的,因为main中的
a是声明的int a[3]数组类型,未发生退化,sizeof(a)得到的是整个数组的总字节数12,除以int长度4得到正确长度3。
修复方案
方案1:额外传递数组长度参数
最通用的兼容C/C++的写法:
// 新增形参接收数组长度 void make3(int* a, int n) { for (int i = 0; i < n; i++) { a[i] = 3; } } int main() { int a[3] = { 0, 1, 2 }; // 调用时在数组未退化的上下文计算长度传入 make3(a, sizeof(a)/sizeof(a[0])); int* b = a; for (int i = 0; i < sizeof(a)/sizeof(a[0]); i++) { cout << *(b + i) << endl; } }
方案2:C++模板自动推导数组长度
类型安全,无需手动传长度:
// 模板参数自动推导数组长度N template<size_t N> void make3(int (&a)[N]) { for (int i = 0; i < N; i++) { a[i] = 3; } } // 调用时直接传数组即可,自动识别长度为3 make3(a);
方案3:使用STL容器替代原始数组
C++场景下更推荐用std::array或std::vector,完全避免数组退化问题:
#include <vector> void make3(std::vector<int>& a) { for (int i = 0; i < a.size(); i++) { a[i] = 3; } }
内容的提问来源于stack exchange,提问作者pink_totoro
相关产品推荐
相关产品推荐

