반응형
안녕하세요. 오늘은 UNION과 STRUCT에 대해 이야기 하겠습니다.
구조체에 대한 이야기는 위에 작성했지만, 저보다 훨씬 자세히 적은 블로그 분들이 많기 때문에 따로 찾아보시길 바랍니다.
UNION의 구조를 먼저 알아보겠습니다.
UNION은 가장 사이즈가 큰 변수와 메모리를 공유합니다.
이게 무슨 말인가 하면
#include <stdio.h>
// 공용체 선언
typedef union data
{
char a;
char b;
char c[2];
}Data;
int main(){
Data data; // 공용체 data 정의
data.c[0] = 'a';
data.c[1] = 'b';
printf("data.a = %c\n", data.a);
printf("data.b = %c\n", data.b);
printf("data.c[0] = %c\n", data.c[0]);
printf("data.c[1] = %c", data.c[1]);
return 0;
}
이런 간단한 코드에서 결과는 어떻게 나올까요?
왜 이런 결과가 나오느냐. 그림을 보시면 바로 이해할 수 있습니다.
이런 구조로 메모리를 서로 공유하고 있습니다. 주소를 찍어보면 더 확실하게 알 수 있습니다.
#include <stdio.h>
typedef union data
{
char a;
char b;
char c[2];
}Data;
int main(){
Data data;
data.c[0] = 'a';
data.c[1] = 'b';
printf("data.a = %p\n", &data.a); // a 주소 출력
printf("data.b = %p\n", &data.b); // b 주소 출력
printf("data.c[0] = %p\n", &data.c[0]); // c[0] 주소 출력
printf("data.c[1] = %p", &data.c[1]); // c[1] 주소 출력
return 0;
}
Union의 사이즈는 가장 사이즈가 큰 변수이며, 메모리를 공유합니다.
Union은 어디에 많이 쓰일까요? 대표적으로 통신 분야로 가장 많이 사용됩니다.
통신에서는 데이터를 전송을 잘하는 것도 중요하지만, 데이터를 수신해서 제대로 분해하는 것도 굉장히 중요합니다.
꼭 이렇게 사용한다는 아니지만, 구조체와 적절히 사용하면 송신부분 수신부분을 만들 수 있습니다.
#include <stdio.h>
#include <stdint.h>
// Struct Packet_s 선언
typedef struct packet_s
{
uint8_t data0;
uint8_t data1;
uint8_t data2;
uint8_t data3;
}Packet_s;
typedef union packet_u
{
Packet_s ps; // Struct Packet_s ps 정의 // 송신
uint8_t pu[4]; // 수신
}Packet_u;
int main()
{
Packet_u packet_data;
packet_data.ps.data0 = 0; // 예를 들어 uuid
packet_data.ps.data1 = 1; // minor
packet_data.ps.data2 = 2; // tx power
packet_data.ps.data3 = 3; // rssi
printf("pacekt_data size = %d bytes\n\n", sizeof(packet_data));
printf("송신 사이즈 : %d bytes\n\n", sizeof(packet_data.ps));
printf("------송신 준비 완료------\n");
printf("--------------------------\n");
printf("--------------------------\n");
printf("-------송수신 완료--------\n\n");
printf("수신 사이즈 : %d bytes\n", sizeof(packet_data.pu));
printf("uuid = %d\n", packet_data.pu[0]);
printf("minor = %d\n", packet_data.pu[1]);
printf("tx power = %d\n", packet_data.pu[2]);
printf("rssi = %d\n", packet_data.pu[3]);
return 0;
}
이런식으로 재밌게 구조체와 공용체를 관계를 적절히 사용하여 통신 패킷을 만들어 보았습니다.
그 외에도 Union은 다양한 방법으로도 유용하게 사용되고 있습니다.
728x90
반응형
'C, C++' 카테고리의 다른 글
[CPP] strcpy_s 사용 예제 (0) | 2021.08.23 |
---|---|
[C] Call by Value VS Call by Reference (0) | 2021.08.16 |
[C] 구조체 포인터 접근과 최적화 (0) | 2021.01.19 |
[C]BMP구조체 : #pragma pack(push,1 )사용하지 않고 정렬하기 2탄 (0) | 2020.03.02 |
[C]BMP구조체 : #pragma pack(push, 1) 사용하지 않고 정렬하기 (0) | 2020.02.18 |