Как уже упоминали другие, вам нужны приведения, но вы можете скрыть уродство в макросе или функции. Однако следует помнить еще одну вещь - требования к выравниванию. На большинстве процессоров вы не можете просто увеличить указатель на тип на произвольное число байтов и преобразовать результат обратно в указатель на исходный тип без проблем с доступом к структуре через новый указатель из-за смещения.
Одной из немногих архитектур (даже если она самая популярная), которая позволит вам сойти с рук, является архитектура x86. Тем не менее, даже если вы пишете для 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;