다른 사람들이 언급했듯이 캐스트가 필요하지만 매크로 나 함수에서 추악함을 숨길 수 있습니다. 그러나 염두에 두어야 할 또 다른 사항은 정렬 요구 사항입니다. 대부분의 프로세서에서 임의의 바이트 수만큼 형식에 대한 포인터를 단순히 증가시키고 정렬을 잘못하여 새로운 포인터를 통해 구조체에 액세스하는 데 문제없이 원래 형식에 대한 포인터로 결과를 다시 캐스트 할 수 없습니다.
x86 아키텍처는 몇 가지 아키텍처 중 하나입니다 (가장 인기가 있다고하더라도). 그러나 Windows 용으로 작성한 경우에도이 문제를 고려해야합니다. Win64에서는 정렬 요구 사항을 적용합니다.
포인터를 통해 partitionMapLength
멤버에 액세스하더라도 프로그램이 중단 될 수 있습니다.
쉽게 Windows에서 __unaligned
같은 컴파일러 확장을 사용하여이 문제를 해결할 수 있습니다
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;
실제로 루프가 무엇입니까? pm이 동일한 값을 갖는 'index'시간을 할당받은 것처럼 보입니다 –
pm -> partitionMapLength에서 발견 된 값으로 pm의 값을 변경 한 다음, 다시 그리고 다시합니다 ... 아마 운율과 이유가 있습니다 데이터 구조는 조금 이상하게 보입니다. 그것은 데이터를 통해 가변 크기의 단계를 허용합니다. –
네, 맞습니다. 조나단입니다. 저는 장치에서 읽은 섹터 크기의 청크 바이트를 단계별로 처리하기 위해이 작업을 수행하고 있습니다. –