3

*(&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

そのような奇妙な行動の原因は何ですか?

4

3 に答える 3