数组长度使用指针

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)

是什么导致了这种奇怪的行为?

Mik*_*our 5

可以使用*(&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)