私はこの種のものを多用し、いくつかのレガシーコードで働いている:あなたが見ることができるようにC - ポインタの配列、および使用状況を割り当てる - 型キャスト安全
// Allocate a look-up-table of pointers.
long *pointerLUT = (long *) malloc(sizeof(long) * numPointers);
...
// Populate the array with pointers.
for (int i=0; i<numPointers; i++) {
pointerLUT[i] = (long) NewFoo();
}
...
// Access the LUT.
Foo *foo = (Foo *) pointerLUT[anIndex];
、これは配列を割り当て一般的なポインタ記憶域を使用するというアイデアを持っています。
Q1。このアプローチは安全ですか?
Q2。スタイル上、どのように改善することができますか?それは必要ですか? (型キャスティングは私の中に恐怖の猿をかきとります。)
ありがとう。
'long'の代わりに' size_t'を使用してください... – smerlin
@smerlin: 'uintptr_t'はより良いオプションです。Cの実装がポインタ型を整数に変換し、情報を失うことなく戻す機能をサポートしている場合は、おそらく 'uintptr_t'を提供します。 'uintptr_t'と' size_t'の違いは、 'uintptr_t'が提供されている場合、voidへの有効なポインタを保持することが保証され、voidへのポインタに変換されたときに元のものと等しくなることが保証されます。 – dreamlax
@dreamlax:はい、それはすべてのコンパイラでは提供されていませんので、uintptr_tやintptr_tを使用する独自のtypedefを使用するとコンパイラでこれらの型が使用でき、他の型ではsize_tが最適な解決策になります...しかしほとんどの場合size_tとuintptr_tは同じ型を表します。 – smerlin