1

関数ポインタの配列の長さを取得する安全な方法はありますか?

以下は機能しますか?

sizeof((uintptr_t)(*fp) / sizeof(uintptr_t)(*fp[0]))
4

2 に答える 2

3

要素の型に関係なく、配列の長さの標準イディオムは次のとおりです。

#define countof(a) (sizeof(a) / sizeof(*(a)))

これaは、 が実際の配列である場合、つまり として宣言されている場合にのみ機能しTYPE a[...]ます。aへのポインターがTYPE、配列を関数に渡すなどして配列から作成された場合、上記のマクロは正しくない結果を生成します。

あなたのコードはそのような混乱の結果だと思います。が逆参照されfpます。これは、 が配列へのポインターである場合にのみ正しくfp、配列要素へのポインターである場合には正しくありません。

于 2013-03-13T19:13:58.130 に答える
1

動的に割り当てられた配列ではなく、配列へのポインターを介してではありません (定義により、動的に割り当てられた配列は除外されます)。

sizeof(apointer)ポインターが指すバッファーのサイズではなく、ポインターのサイズを返します。C ではsizeof、ポインターが配列または単一の要素 (実際には 1 の配列) を指していることを知る方法はありません。

これを行うsizeof(*apointer)と、単一の要素 (または配列の最初の要素) のサイズが返されます。これは、ポインターが配列または単一の要素を指していることを sizeof が認識できないためです。

于 2013-03-13T19:14:41.797 に答える