c언어 - 구조체 맴버 정렬 사용

구조체의 크기 구하기

c언어에서 구조체를 정렬할때 맴버 중에서 가장 큰 자료형의 크기의 배수로 정렬함.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct Head{
    char c;    // 1바이트
    int i;       // 4바이트
};
 
 
 
// ---------------------------
 
 struct Head header;
 
printf("%d\n"sizeof(header));                 // 8: 구조체 전체 크기는 8바이트
printf("%d\n"sizeof(struct PacketHeader));    // 8: 구조체 이름으로 크기 구하기
 
// 결과
// 8
// 8
cs

1byte char c
3byte padding - 남는 공간
4byte int i


구조체에서 맴버의 위치(offset)을 구하는 함수.

offsetof(struct 구조체, 맴버)
offsetof(구조체별칭, 맴버)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <stddef.h>   // offsetof 매크로가 정의된 헤더 파일
 
struct Head{
    char c;    // 1바이트
    int i;       // 4바이트
};
 
int main()
{
    printf("%d\n", offsetof(struct Head, c));    // 0
    printf("%d\n", offsetof(struct Head, i));    // 4
 
    return 0;
}
cs

구조체 정렬 크기 조절

Visual Studio, GCC 4.0 이상
#pragma pack(push, 정렬크기)
#pragma pack(pop)

GCC 4.0 미만
__attribute__((aligned(정렬크기), packed))


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#pragma pack(push, 1)    // 1바이트 크기로 정렬
struct Head{
    char c;    // 1바이트
    int i;       // 4바이트
};
#pragma pack(pop)        // 정렬 설정을 이전 상태(기본값)로 되돌림
 
 
// ---------------------------
 
 struct Head header;
 
printf("%d\n"sizeof(header));                 // 5: 1바이트 단위로 정렬함.
 
// 결과
// 5
cs



출처 : c언어 코딩도장

댓글