関数ポインタの配列の長さを取得する安全な方法はありますか?
以下は機能しますか?
sizeof((uintptr_t)(*fp) / sizeof(uintptr_t)(*fp[0]))
要素の型に関係なく、配列の長さの標準イディオムは次のとおりです。
#define countof(a) (sizeof(a) / sizeof(*(a)))
これa
は、 が実際の配列である場合、つまり として宣言されている場合にのみ機能しTYPE a[...]
ます。a
へのポインターがTYPE
、配列を関数に渡すなどして配列から作成された場合、上記のマクロは正しくない結果を生成します。
あなたのコードはそのような混乱の結果だと思います。が逆参照されfp
ます。これは、 が配列へのポインターである場合にのみ正しくfp
、配列要素へのポインターである場合には正しくありません。
動的に割り当てられた配列ではなく、配列へのポインターを介してではありません (定義により、動的に割り当てられた配列は除外されます)。
sizeof(apointer)
ポインターが指すバッファーのサイズではなく、ポインターのサイズを返します。C ではsizeof
、ポインターが配列または単一の要素 (実際には 1 の配列) を指していることを知る方法はありません。
これを行うsizeof(*apointer)
と、単一の要素 (または配列の最初の要素) のサイズが返されます。これは、ポインターが配列または単一の要素を指していることを sizeof が認識できないためです。