他の人が言ったように、キャストが必要ですが、マクロまたは関数で醜さを隠すことができます。ただし、もう 1 つ注意すべき点は、アライメントの要件です。ほとんどのプロセッサでは、型へのポインターを任意のバイト数だけインクリメントし、結果を元の型へのポインターにキャストし直すことはできません。新しいポインターを介して構造体に問題なくアクセスできます。
x86 アーキテクチャは、それを回避できる数少ないアーキテクチャの 1 つ (最も一般的なものであっても) です。ただし、Windows 用に作成している場合でも、この問題を考慮に入れる必要があります。Win64 ではアライメント要件が強制されます。
partitionMapLength
そのため、ポインターを介してメンバーにアクセスしても、プログラムがクラッシュする可能性があります。
__unaligned
Windowsのようなコンパイラ拡張機能を使用して、この問題を簡単に回避できる場合があります。
PartitionMap __unaliged *pm(reinterpret_cast<PartitionMap *>(partitionMaps));
for ( ; index > 0 ; --index)
{
pm = (PartitionMap __unaligned *)(((char *)pm) + pm->partitionMapLength);
}
return pm;
または、整列されていない可能性のあるデータを適切に整列された構造体にコピーできます。
PartitionMap *pm(reinterpret_cast<PartitionMap *>(partitionMaps));
char* p = reinterpret_cast<char*>( pm);
ParititionMap tmpMap;
for ( ; index > 0 ; --index)
{
p += pm->partitionMapLength;
memcpy( &tmpMap, p, sizeof( newMap));
pm = &tmpMap;
}
// you may need a more spohisticated copy to return something useful
size_t siz = pm->partitionMapLength;
pm = reinterpret_cast<PartitionMap*>( malloc( siz));
if (pm) {
memcpy( pm, p, siz);
}
return pm;