구조체와 공용체 (Struct와 Union)에 대한 고찰
2022. 2. 23. 21:00코드
struct MyStruct {
int a;
double b;
char c;
}A;
union MyUnion
{
int a;
double b;
}B;
int main(void) {
printf("MyStruct: %d\n", sizeof(A));
printf("MyUnion: %d\n", sizeof(B));
}
결과화면:
MyStruct: 24
MyUnion: 8
union MyUnion
{
int a;
double b;
char str[31];
}B;
union OuterUnion{
union InnerUnion
{
int a;
double b;
char str[31];
}B;
}C;
int main(void) {
printf("MyStruct: %d\n", sizeof(C));
printf("MyUnion: %d\n", sizeof(B));
return 0;
}
결과화면:
MyStruct: 32
MyUnion: 32
struct {
int status;
char a[128];
} b;
int main(void) {
printf("MyStruct: %d\n", sizeof(b));
return 0;
}
결과화면:
MyStruct: 132
typedef struct
{
int length;
char buffer[];
}A;
int main(void) {
A a;
a.length = 3;
a.buffer;
printf("%p: %p \n", &a.length, &a.buffer);
printf("MyStruct: %d\n", sizeof(A));
}
결과화면:
0073FCC8: 0073FCCC
MyStruct: 4
buffer[]사이즈는 0임. 그 이유 : https://stackoverflow.com/questions/15607855/char-buffer-with-zero-length-accomdates-the-integer
typedef struct
{
int length;
char *buffer;
}A;
int main(void) {
A a;
a.length = 3;
a.buffer;
printf("%p: %p \n", &a.length, &a.buffer);
printf("MyStruct: %d\n", sizeof(A));
}
결과화면:
0115F8FC: 0115F900
MyStruct: 8
struct
- 각 멤버들의 메모리 시작 주소가 다름.
- 가장 큰 변수의 크기 값을 기준으로 잡고, 기준 값의 크기에 나머지 순서대로 배치하여 구조체의 전체 크기가 결정됨.
(long(8), long(8) int(4), char(1), char(1) => 22byte일거 같지만,
long(8), long(8), int2(8), char2(8) 해서 32byte이다.
- 멤버의 순서가, 구조체의 크기에 영향을 줄 수 있음.
union
- 각 멤버들의 시작 주소가 모두 동일.
- 멤버 변수 중 가장 큰 크기의 값을 하나 할당 받고, 모든 멤버가 그 메모리 공유
규칙 (메모리 정렬)
- 64비트 시스템에선, int가 4 단위로 시작, long은 8, short은 2단위로 주소가 시작됨.
- char와 char[] (어떠한 메모리 엑세스도 가능)는 특이함, 얘네는 패딩이 필요가 없음.
- struct
규칙 (주소 할당)
- (64비트 시스템) n * 16 bytes 배수로 struct크기가 지정됨.
참고자료
https://stackoverflow.com/questions/4306186/structure-padding-and-packing
'C > C' 카테고리의 다른 글
[C] 헤더파일에 구조체 선언하기 (0) | 2022.05.02 |
---|---|
[C] shm_open (0) | 2022.04.22 |
[C] Error 상수 error.h (0) | 2021.06.08 |
Char형 문자열 배열을 HEX dump 뜨기 (0) | 2021.05.12 |
[C 언어] 객체 지향 C 스타일 (Object Oriented C programming style) (0) | 2020.04.21 |