반응형
고급 포인터의 개념인데, 한마디로 어떤 자료형 포인터로 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이라는 이름으로 매크로화 하였다.
매크로 만들땐 후치우선등을 고려하여 다른것에 우선순위를 뺏기지 않기 위해 반드시 괄호로 감싸준다,
반응형
'배우는 과정 > 코딩공부' 카테고리의 다른 글
API란 무엇일까? localhost? (0) | 2024.11.19 |
---|---|
데이터 엔지니어(DE)가 배우면 좋은 것들 (0) | 2024.11.13 |
데이터 개발자들이 사용하는 데이터베이스(DB)의 종류 (1) | 2024.11.11 |
구조체 데이터를 읽어올 때 (0) | 2024.02.07 |
구조체에 비트필드 구조체 넣기 (0) | 2024.02.07 |
댓글