반응형

출처 : http://kin.naver.com/browse/db_detail.php?d1id=1&dir_id=10104&docid=285334

void 형변환에 관하여 %p


#include

int multi[2][4];

int main()
{
printf("\nmulti = %p",(void *)multi); /* ----------- 1
printf("\nmulti[0] = %p",(void *)&multi[0]); /* ---------- 2
printf("\nmulti[0] = %p",(void *)multi[0]); /* ---------- 3
printf("\n&multi[0][0] = %p\n",(void *)&multi[0][0]); /* ---------- 4
return 0;
}

요기에 보면.. void로 형변환 해주자나여.. 이게 맞는 거는 알겠는데, 왜
void 형변환을 꼭 해줘야 하는지..

형변환 안하고, 그냥 %u 쓰구 컴파일하면,

warning: unsigned int format, pointer arg (arg 2) 이런 경고 메시지가
뜨더라구여..

void 포인터가 뭔지는 아는데요..

가령 1번 줄에서, multi 를 (void *)multi 로 형변환해주면, multi가 가지고
있는 bit(표현이 맞나?)에

어떤 변화가 생기는건지 궁금하구, 또 왜 그렇게 형변환을 해줘야 하는지요..

그것은 %p라는 것은 void* 형을 다룹니다.



[질문자 평]

사실, 제가 VC++로 컴파일로 하니.. 에러는 발견되지가 않더군요..

아마 컴파일러랑 라이브러리의 영향을 받는 warning 증상 같습니다...^^;

그런데, 조금 좋군요..ㅋㅋㅋ;

%p는 (void*)를 취급하며, 그것의 주소를 화면의 출력을 하는 구조입니다.

%u는 그것을 unsigned int 정수형으로 출력을 하라는 것이구요..

실제 구현상에는 돌아갈때는 아무런 변화가 있을수도 있고, 없을 수도 있습니다.

int 형은 32 bit인데 char형은 8 bit에다 넣을 려면은 어떻게 해야할까요?

이중에서 해당하는 하위 8 bit를 넣어야 겠죠.. 이런식의 변화는 있을수 있습니다.

또 실수형을 정수형으로 넣을경우는? 거기의 맞는 특별한 연산을 해줘야 겠죠?

물론, (void*)는 영향이 없고, 단순히 시작주소만을 가집니다.. 즉, 모형를 모른다는 것입니다.

모형의 요소 - 할당바이트, 데이터 저장 형식(실수, 정수, 문자..)

다시 정리하면은 %p는 (void*)로 받도록 약속을 하였습니다. 그래서 형변환을 해줘야 warning을 뜨지않고, 프로그래머가 의도적으로 한것이구나를 컴파일러가 알아서 거기의 맞는 동작을 하겠죠? 그래서 형변환을 하였습니다.^^;


그래서 어떠한 포인터를 삭제할때

struct del{

void operator()(void * ptr){

delete ptr;

}

};

이 가능하다

반응형

+ Recent posts