2012-02-12 1 views
1

:sizeof 및 부호없는 char 배열 오류? (C/C++) 내가이 구조를 작성한

struct bmpheader { 
    unsigned char magic[2]; 
    unsigned int fsize; 
    unsigned int unused; 
    unsigned int pixdata_offset; 
    unsigned int headersize; 
    unsigned int width; 
    unsigned int height; 
    unsigned short planes_color; 
    unsigned short bpp; 
    unsigned int compression; 
    unsigned int sizeofpix; 
    unsigned int resolutionx; 
    unsigned int resolutiony; 
    unsigned int colors; 
    unsigned int imp_colors; 
}; 

그리고 난를 sizeof 기능에 문제가있다. 내 손가락에 메신저를 매길 때마다 매번 54 바이트를받습니다. sizeof 함수는 매번 나에게 56. 왜? 문제는 부호가없는 char 배열로, magic [2] 배열을 제거 할 때, sizeof가 52입니까? sizeof (header.magic)는 2로 표시됩니다. 지금까지 unsigned char은 1 바이트 유형을 알고 있습니까?

미리 답변 해 주셔서 감사합니다. 4 바이트의 주소에 배치 할 때,

마르신

+1

손가락으로 54까지 셀 수 있습니까? –

+1

컴파일러는 구조체 레이아웃에 패딩을 삽입하여 필드 정렬을 향상시킵니다. 이 패딩은 두 개의 마술 숯과 첫 번째 int 사이에 int가 모두 4 바이트 경계에 있는지 확인합니다. –

+1

@SethCarnegie, 내 손가락에 최대 1024 개까지 셀 수 있습니다. – Lol4t0

답변

1

(컴퓨터에)를 int이어야하기 때문에, 또는 더 효율적입니다. 컴파일러는 char 배열 다음에 2 바이트의 패딩을 삽입합니다.

+0

너무 강해야합니다. 컴파일러는 종종 성능상의 필요성보다는 성능상의 이유로이를 선택합니다. –

+0

감사합니다. 답변을 업데이트했습니다. – Lindydancer

+0

아. 큰. 알아 둘만한. 고마워요 : P 이제 작동 중입니다; p 그리고 조금 더 질문이 생깁니다 (그리고 매우 간단합니다). 서명이없는 char magic [2]; 한 번에 "BM"을 쓰는 방법, 마법이 아닌 [0] = 'B', 마법 [1] = 'M'? 나는 마술 = "BM"으로 시도했다. 또는 magic = { 'B', 'M'}; 두 작업 모두 ... – marxin