컴퓨터공부/C & C++ & STL

타입 변환을 안전하게 union으로 하자!!

achivenKakao 2009. 4. 3. 01:24

아래는 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;
}