c언어의 형변환은 명시적이지도 않고, 너무 강력함.
-> 개발자가 의도인지, 실수인지 명확하게 구별할 수 없음!
따라서 c++의 캐스팅을 이용하자.
아래 Problem 을 코딩하라!
int *p = malloc(sizeof(int));
free(p);
1) malloc 의 경우.
: malloc 의 반환값은 void * 이기 때문임.
-> 명시적으로 형변환 처리함을 확인할 수 있음.
int *p = static_cast<int * >( malloc(sizeof(int)) );
free(p);
2) new 연산자의 경우는 암시적 형변환 처리됨.
이런것도 가능함. 1번
int n =0; double *pd = (double *)(&n); *(포인터)pd = 3.4;
-> int형인 n은 double *로 형변환해서 double 포인터가 참조할 수 있게 함.
근데 int n에다가 3.4를 넣고 있네??
--> 심각한 문제임. 3.4는 double 형 8바이트이고, int는 4바이트
1) 다른 메모리에 접근할 수 있는 문제 발생 가능
2) 3.4 데이터가 잘릴수도 있고,
=> 어떤 문제가 나와도 이상하지 않음
이런것도 가능함. 2번
cont int c = 20; int *p = (int*)(&c); *p= 4;
- 결과 : 상수값을 변경하고 있음..
반드시 출력을 해보자... 위의 c값을
: 상수는 변경되지 않는 값인데, 변경을 하고 있다... 원리 원칙을 무시하고 있음.
: 위의 예제를 출력해서 확인하라.
어떤 결과가 나올지....
: 미정의 결과가 나오고, 에러 발생함.
-> 왜 이럴까? 기존 int 크기는 4바이트인데 강제로 double 포인터에다가 주소를 넣고 있는 상황인데,,, 메모리를 4바이트 더 확보한다. 근데 그 메모리는 어디에 있는 건지는 모르겠다... 호호