c언어에서의 casting

보물창고·2022년 8월 13일
0

c++ basic 코드누리

목록 보기
22/50
post-custom-banner

결론

  • c언어의 형변환은 명시적이지도 않고, 너무 강력함.
    -> 개발자가 의도인지, 실수인지 명확하게 구별할 수 없음!
    따라서 c++의 캐스팅을 이용하자.

  • 아래 Problem 을 코딩하라!

캐스팅

  • c언어에서는 void*
    -> 다른 포인터 형변환이 가능함.
  • c++에서는 그렇지 않음.
    -> 명시적으로 캐스팅 해야 함.

예제 코드

int *p = malloc(sizeof(int));

free(p);
  • c++에서는 이런식으로 형변환해야함.

1) malloc 의 경우.
: malloc 의 반환값은 void * 이기 때문임.
-> 명시적으로 형변환 처리함을 확인할 수 있음.

int *p = static_cast<int * >( malloc(sizeof(int)) );

free(p);

2) new 연산자의 경우는 암시적 형변환 처리됨.

  • c언어 캐스팅은 정말 강력함.

이런것도 가능함. 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값을
    : 상수는 변경되지 않는 값인데, 변경을 하고 있다... 원리 원칙을 무시하고 있음.

💀problem

: 위의 예제를 출력해서 확인하라.
어떤 결과가 나올지....

int 변수를 int 포인터값으로 참조 한후, 역참조한후 출력해보자.

int 변수를 double 포인터값으로 참조 후, 역참조한 후 출력하자.

: 미정의 결과가 나오고, 에러 발생함.
-> 왜 이럴까? 기존 int 크기는 4바이트인데 강제로 double 포인터에다가 주소를 넣고 있는 상황인데,,, 메모리를 4바이트 더 확보한다. 근데 그 메모리는 어디에 있는 건지는 모르겠다... 호호

  • 디버그 확인하면 , 버퍼 오버런 발생
profile
🔥🔥🔥
post-custom-banner

0개의 댓글