使用指针的数组长度

sudeepdino008

可以计算数组长度*(&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实际上是一个数组时。funcarr是一个指针,所以这个指针引用的内存随机字给未定义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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章