본문 바로가기

Programming/C language

Chapter 13. 구조체와 공용체

구조체 


C언어 자료형 : 일정 길이의 memory에 저장된 정보를 해석하는 방법 


배열 : 일 형식(자료형)의 연속(연접)'집합체'


 


구조체 : 서로 같거나 다른 형식들의 연속된 '집합체'


공용체 : 한 자료-같은 크기-에 여러 해석 방법을 부여하는 문법 



즉, 구조체 => 자료형을 세트화 한 것 


구조체를 매개변수로 전달할 때에는 주소를 전달하자. (오버헤드가 크다.) 


구조체 맴버로 구조체를 넣는 것이 가능하다. 


구조체의 맴버로 자기자신의 포인터를 넣기도 하는데, 이를 자기 참조 구조체 라고 한다. -> Linked list



구조체 맴버 맞춤


visual studio 컴파일러가 디폴트로 구조체의 맴버를 자르는 단위는 8byte 이다. 그렇기에 그보다 크기가 적은 멤버도 8byte의 크기는 무조건 할당받게된다. 


이를 #pragma pack(push, 1) ~~ #pragma pack(pop) 과 같은 방식으로 1byte 단위로 바꿀 수 있는데


구조체를 통째로 


- 파일에 저장하거나 읽어오는 경우 

- 네트워크로 전송하거나 수신하는 경우  


맴버 맞춤에 의한 오류가 발생할 가능성이 존재한다. 



bit filed


구조체 맴버를 bit 단위로 할당하는 방법 



공용체


한 가지 자료에 대해 여러가지 해석방법(자료형)을 부여하는 문법 





연습문제)


1) 다음 예제의 실행결과와 이유는 무엇입니까.


#include <stdio.h>


typedef struct USERDATA

{

char ch;

int nAge;

} USERDATA;


typedef struct MYDATA

{

char ch;

int nAge;

double dData;

} MYDATA;


int main(void)

{

printf("%d\n", sizeof(USERDATA) );

printf("%d\n", sizeof(MYDATA));


return 0;

}



Q )


visual studio는 구조체 맴버의 크기를 8byte 단위로 할당하기 때문에 USERDATA는 char가 1byte, int 가 4byte 이므로 둘다 8byte가 안돼 8byte를 반으로 나눠 4byte로 쪼갠 후 그곳에 각각 할당한다. 

그렇기 때문에 8이 출력된다. 


또한 MYDATA는 char ch와 int nAge 가 합쳐져 8byte가 되고, 거기에 double 은 애당초 8byte 이므로 총 16byte가 되서 16이 출력된다. 




2) 자기 자신에 대한 포인터를 멤버로 갖는 구조체를 무엇이라 하는지 쓰세요. 


Q )


자기 참조 구조체 (Linked list에 주로 쓰인다.) 





- 출처 : 독하게 시작하는 C 프로그래밍 (최호성, 루비 페이퍼)