[완료]c언어에서 자료형변환에대해 궁금한게 있어요
글쓴이: visualplus / 작성시간: 목, 2008/02/28 - 3:39오후
안녕하세요.
c언어에서 자료 형 변환 할 때 궁금한게 있어서 질문 올립니다.
자료 형 변환 할 때..
int형을 char형으로 변환한다던지 하는것은 그럴 수 있겠구나.. 하겠는데..
구조체에서 구조체로 형 변환하는게 이해가 가질 않습니다.
안에 변수도 다 다르고 하는데 어떻게 변환이 되는건지..
혹시 주소값을 참조하면서 그러는건지..
흠 이해가 잘 안가네요..
ipq_packet_msg_t *m = ipq_get_packet(inbuf);
unsigned char *packet = NULL;
struct iphdr *iph = NULL;
if (!m)
break;
if (m->data_len >= sizeof(struct iphdr)) {
packet = (unsigned char *)m + sizeof(*m);
}
iph = (struct iphdr *)packet;
소스좀 보다보니 이런 소스가 있던데..
잘 모르겠네요..
과연 어떻게 전혀다른 구조체가 형 변환이 되는것이죠?
Forums:
형변환이 아니라
계속 똑같이 포인터 아닌가요?
단지 무슨 포인터 인가만 바뀐 것일뿐 포인터는 그냥 주소값만 저장하면 되니깐 별 상관없을듯?
윗분 말씀대로
윗분 말씀대로 포인터간 변환은 전혀 연관없더라도 ()를 이용해서 가능합니다.
포인터 자체는 (플랫폼에 따라 다르지만 일반적인 32비트환경에서는) 4바이트의 정수이므로, 딱히 변환과정자체에는 문제될게 없습니다.
그러나 변환된 포인터를 사용할때는 충분히 주의해서, 변환해도 문제 없음이 분명할때 이용해야며, 일반적으로 추천되지 않고 위험합니다.
이러한 변환이 자주 이용되는 예로 C의 동적할당을 들수 있습니다.
struct T *pT = (struct T*)malloc(sizeof(struct T));
이경우는 malloc이 반환하는 void*를 struct T*로 변환해주는 것이며, 반환된 void*는 struct T만큼의 메모리가 할당된 곳을 가리키고 있으므로 struct T*로의 변환은 합당합니다.
이외에도, C++에서 이러한 것을 쓴다면 아마도 상속관계에서 자식클래스를 부모클래스로 형변환하거나 할때 이용할 수 있습니다.
윗분들 말씀이 모두
윗분들 말씀이 모두 옳습니다.
참고로, 서로 다른 구조체와 구조체 혹은 구조체와 보통 변수 사이에서의 변환이 많이 필요한 경우에는 공용체(union)를 씁니다.
대표적인 예로 DOS 시절에 한글 조합형 표기나 (아래와 같은 정의를 할 수 있겠죠?)
typedef union { short int code; struct { unsigned short f : 5; unsigned short m : 5; unsigned short i : 5; unsigned short ishan : 1; } fi; } syllable_t;
DOS 시절의(또다) 인터럽트 발생시킬 때 쓰는 dos.h의 union REGS가 있습니다.
"그거 이름은 하늘이라고 합니다. 무사장님." - 제국군 가시나무 군단 312소대장 틸러 달비 부위
http://cppig1995.n-pure.net/mh || 몽화 대사전
Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.
댓글 달기