본문 바로가기
배우는 과정/코딩공부

구조체 자료형 포인터로 casting하는 이유

by c급선임 2024. 2. 7.
반응형

고급 포인터의 개념인데, 한마디로 어떤 자료형 포인터로 casting을 한다는 것은 지금부터 그 자료형만큼 원본 데이터를 바라본다는 의미이다,

 

#include <stdio.h>

//#define  info	 ((struct st *)0x100)

unsigned char buf[] = {0x4d,0x4d,0x55,0x5f,0x45,0x6e,0x61,0x62,0x6c,0x65,0x44,0x43,0x61,0x63,0x68,0x65};

#define  info	 ((struct st *)buf)

struct st
{
	unsigned char x;
	unsigned char y;
	unsigned short length;
};

void main(void)
{
	printf("0x%x, 0x%x, 0x%x\n", info->x, info->y, info->length);
	printf("0x%x, 0x%x, 0x%x\n", (info+1)->x, (info+1)->y, (info+1)->length);
}

 

예를 들어 위에 코드는 기존에 buf라는 주소변수를 +1,-1이나 [0],[1] 를 해서 이동하게 되면 char (1Btye) 씩만 이동하는데,

이 변수를 struct st라는 4Byte 자료형의 포인터로 casting 해주면 병렬이동할때마다 4 byte씩 움직이게 된다.

이를 이용하여 4의 배수로 인덱스를 이동하면서 첫 주소부터 구조체안에 있는 맴버들을 각 자료형에 맞게 뽑아 올 수 있다.

(원래는 맨 위에 주석처리 한것처럼 원본 데이터가 쭉 읽힌 버퍼 자체의 첫 주소부터 읽어와야 하는데, 이건 연습문제라 임의로 원본을 만들어서 실행)

 

(밑에 자료는 특정 함수로 buf에 512 Byte짜리 원본을 읽어왔고 1바이트 짜리 16진수값 (ex.0xFF)이 한줄에 32개씩 총 16줄로 이루어져 있음)

typedef struct
{
	/* Entry의 각 멤버를 설계한다 */
	char name[8];
	char tail[3];
	char attribute;
	char reserved;
	char TT;
	times ct;
	day cd;
	int reserved3[2];
	short first_cluster_low;
	int file_size;
}ENTRY;

static unsigned int buf[128];

#define Name  ((ENTRY*)(buf))

 

위에 코드도 마찬가지인데, buf안에 있는 원본값들을 int(4byte) 씩 읽던 것을 ENTRY라는 구조체 자료형으로 Casting 해주면, ENTRY라는 변수에 사칙연산이나 []를 해주어 32Byte씩 병행이동 하면서 내부에 맴버들을 각 맴버의 자료형에 맞게 읽어낼 수 있다.

 

여기선 캐스팅한 주소형 변수를 나중에 결과값을 산출할때마다 사용해야 하므로 Name이라는 이름으로 매크로화 하였다.

매크로 만들땐 후치우선등을 고려하여 다른것에 우선순위를 뺏기지 않기 위해 반드시 괄호로 감싸준다,

 

반응형

댓글