可以计算数组长度*(&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);
}
这给出了输出:
5
8
是什么导致了这种奇怪的行为?
数组长度可以使用*(&arr + 1)-arr来计算
仅当arr
实际上是一个数组时。内func
,arr
是一个指针,所以这个指针引用的内存随机字给未定义behavoiur。
仅给出指向数组第一个元素的指针,就无法判断数组的大小。您可以通过引用传递数组:
template <size_t N>
void func(int (&arr)[N]) {
cout<<ARRAY_SIZE(arr)<<endl;
cout<<N<<endl; // equivalent, and less weird
}
使用相同的技术,我们ARRAY_SIZE
无需依靠预处理器或任何奇异的指针算法就可以重新实现:
template <size_t N>
size_t ARRAY_SIZE(int (&arr)[N]) {
return N;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句