为什么C++中数组在main与其他函数中sizeof计算结果不同
问题原因分析
你遇到的数值差异是C/C++的数组退化为指针规则导致的,你的猜测是正确的。
两个场景的sizeof计算逻辑
- main函数中的计算:
你在main内定义的int arr[5]是完整的栈上数组类型,编译器完整感知到它的长度信息,sizeof(arr)计算的是整个数组占用的总字节数:在int占4字节的常规环境下,结果为5*4=20。 - func函数中的计算:
C/C++规定,数组作为函数参数传递时,会自动退化为指向数组首元素的指针。你写的函数参数void func(int arr[])会被编译器等价处理为void func(int* arr),此处的arr是指针类型,sizeof(arr)计算的是指针本身的字节长度:32位环境下结果为4,64位环境下结果为8,和数组实际长度完全无关。
补充解决方案
如果需要在自定义函数内获取数组的完整大小,可以通过两种方式实现:
- 额外传递数组长度作为参数
void func(int arr[], int len){ // 直接使用传入的len即可 } // 调用时写为func(arr, sizeof(arr)/sizeof(arr[0]));
- 使用模板推导数组长度(仅适用于编译期可知长度的栈数组)
template<size_t N> void func(int (&arr)[N]){ cout<<"func size: "<<sizeof(arr)<<"\n"; // 此处输出和main内一致 cout<<"array length: "<<N<<"\n"; // 可直接拿到元素个数N }
内容的提问来源于stack exchange,提问作者virteanchi
相关产品推荐
相关产品推荐

