일부 프레임 구조에서 작업하면서 이상한 행동을 보았습니다. 나는 빨리 다음과 같이 독립적 인 샘플 코드에서 테스트 :이상한 구조체 패킹
struct non_alligned_struct
{
uint8_t flag;
// start of uint32 bit fields
uint32_t a:2;
uint32_t b:2;
uint32_t c:1;
uint32_t d:1;
uint32_t e:1;
uint32_t f:1;
uint32_t g:3;
uint32_t h:1;
uint32_t i:1;
uint32_t j:3;
uint32_t k:3;
uint32_t l:1;
uint32_t m:1;
uint32_t n:1;
uint32_t o:1;
uint32_t p:3;
uint32_t q:2;
uint32_t r:1;
uint32_t s:1;
uint32_t t:2;
//4 bytes ends here
// shouldn't this start at 5th byte ??
uint16_t u;
uint16_t v:13;
uint16_t w:3;
uint16_t x;
uint16_t y:13;
uint16_t z:3;
};
int main()
{
struct non_alligned_struct obj1;
void *ptr1 = &obj1;
void *ptr2 = &(obj1.u);
printf("ptr1: %p, ptr2: %p, ptr2 - ptr1: %d\n", ptr1, ptr2, ptr2 - ptr1);
return 0;
}
출력 : PTR1 : 0x7fff3216a620, PTR2 : 0x7fff3216a626, PTR2 - PTR1 : 6
질문 : PTR2 왜 - PTR1 6이어야한다. 내 계산 당 5로해야합니다. 또한 구조 13 바이트, 그래서 4 바이트 정렬 및 패딩 이상한 방식으로 수행됩니다. I 멤버 변수에 임의의 값을 부여하여 검증 I 패딩은 다음 굵은 위치
00000000에서 행해진 관찰 : 01 22 31 10 67 00 FE FF 86 01 FE FF 86 01 00
확실히 ptr2-ptr1은 6과 같습니다 ... – DigitalNinja
MSVC에서'struct'를'#pragma pack (push, 1)'과'#pragma pack (pop)'으로 묶으면 예상 결과'5' 그렇지 않으면'8'입니다. void * 형에 대한 포인터 산술은 구현이 정의 되었기 때문에'void *'포인터를'char *'로 변경해야했습니다. –
'void *'s에 대한 산술 연산을하는 제약 위반. 컴파일러가이 오류에 대한 진단을 내야했습니다. – EOF