아래는 union으로 type 변환을 하는것이다.
상수타입에 대해서는 그냥 해도 별 상관이 없기 때문에, 주소 변환을 시도 해보았다.
잘 된다. 사실 이 테크닉이 모든 곳에서 사용 된다고 할 수는 없지만 썩 괜찮다고 본다.
그리고 아래의 type 변환을 U32로 강제로 변환해서 하더라도 문제 없이 돌아가더라.
하지만 주소를 U32로 강제 변환하는 것보다 union으로 하는게 더 안전하다고 본다.
+
typedef unsigned long U32;
typedef struct __Data
{
U32 x;
U32 y;
}Data;
typedef union __Union_typecast
{
U32 ullong;
Data *pData;
}Union_typecast;
U32 typecastFunc(Data *In_pData)
{
Union_typecast typecaster;
printf("\nInside typecastFunc() \n");
memset(&typecaster, 0x0, sizeof(typecaster) );
typecaster.pData = In_pData;
printf("Address of typecaster.pData[%p] \n", typecaster.pData);
printf("value of typecaster.ullong[%08X] \n", typecaster.ullong);
printf("End typecastFunc() return U32 type \n\n");
return typecaster.ullong;
}
int main()
{
Data *pData;
Data *pGetData;
U32 ulGetAdr;
pData = (Data *)malloc( sizeof(Data) );
pData->x = 1;
pData->y = 2;
printf("Address of pData[%p], \n\tvalue of pData->x[%d], pData->y[%d] \n", pData, pData->x, pData->y);
ulGetAdr = typecastFunc(pData);
printf("value of ulGetAdr[%08X] \n", ulGetAdr);
pGetData = (Data *)ulGetAdr;
printf("==> put ulGetAdr to pGetData\n");
printf("Address of pGetData[%p], \n\tvalue of pGetData->x[%d], pGetData->y[%d] \n", pGetData, pGetData->x, pGetData->y);
free(pData);
return 0;
}