*(&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
そのような奇妙な行動の原因は何ですか?