sud*_*008 3 c++ arrays pointers pass-by-reference
可以使用*(&arr+1)-arr该数据计算数组长度,然后简化(&arr)[1]-arr进一步简化为的数组长度1[&arr]-arr.
但是,当在与已完成内存分配的函数中计算长度时,计算错误的结果.
例如,
#include <iostream>
#define ARRAY_SIZE(arr) (1[&arr]-arr)
using namespace std;
void func(int *arr)
{
cout<<ARRAY_SIZE(arr)<<endl;
}
int main()
{
int arr[]={1,2,3,4,5};
cout<<ARRAY_SIZE(arr)<<endl;
func(arr);
}
Run Code Online (Sandbox Code Playgroud)
这给出了输出:
5
8
Run Code Online (Sandbox Code Playgroud)
是什么导致了这种奇怪的行为?
可以使用*(&arr + 1)-arr计算数组长度
只有arr它实际上是一个数组.在内部func,arr是一个指针,所以这取消了一个随机的内存字,以给出未定义的行为.
仅给出指向其第一个元素的指针,无法分辨数组的大小.您可以通过引用传递数组:
template <size_t N>
void func(int (&arr)[N]) {
cout<<ARRAY_SIZE(arr)<<endl;
cout<<N<<endl; // equivalent, and less weird
}
Run Code Online (Sandbox Code Playgroud)
使用相同的技术,我们可以重新实现,ARRAY_SIZE而无需使用预处理器或任何奇怪的指针算法:
template <size_t N>
size_t ARRAY_SIZE(int (&arr)[N]) {
return N;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
200 次 |
| 最近记录: |