[C Question] 포인터 형변환 기초 문제
카테고리: c-question-lv1
1. 포인터의 형변환 문제
short sArr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int* pI = (int*)sArr;
int iData = *((short*)(pI + 2));
printf("1번 문제 정답: %d\n", iData);
정답 & 풀이
- short형으로 만들어진 sArr의 배열을 pI의 변수는 int형 포인터로 보고 있다.
- 이 말은 배열의 크기가 2byte 씩 차지하고 있었지만 pI는 4byte로 보고 있다는 것이다.
- 여기까지 정리하면 pI는 sArr 이라는 변수와 마찬가지로 배열의 첫번째를 보고 있는 것까지는 동일하나, sArr는 2byte씩 보고있고, pI는 4byte씩 보고 있다는 뜻이다.
- pI 에게 +2 를 해준다면 다음 다음 주소 값을 보고 있게 된다. ( 이 부분은 그림으로 나타내는 것이 이해하기 쉬우니 그림을 첨부하자. )
- 위의 그림을 보면 pI는 주소값에 +1을 할 때마다 4byte씩 건너뛰게 되고, sArr은 2byte씩 건너뛰게 된다는 것을 알 수 있다.
- 그러므로, pI+2의 값은 4와 5사이에 있는 주소값에 도착했다고 볼 수 있다.
- 여기서 short으로 다시 캐스팅을 해주었다 (= A의 상황), 만약 그렇지 않다면? (= B의 상황) 아래 그림으로 보자
- 위의 그림처럼 강제캐스팅을 한 A는 그대로 5의 값을 표현할 수 있지만,
- 강제 캐스팅을 하지 않는 상황(= B)이라면? 값은 단번에 예상하기가 힘들다.
- 왜 예상하기 힘든지는 2번문제로 이어진다 !
2. 포인터의 형변환 주의할 점
char cArr[2] = { 1, 1 };
short* pS = (short*)cArr;
iData = *pS;
printf("2번 문제 정답 : %d\n", iData);
정답 & 풀이
- 이번에는 1번문제와 다르게 값을 출력할 때 원래 자료형은 char 형으로 변환하지 않고 short형으로 그대로 뽑으려했다.
- 값이 1번문제처럼 표현할 수 있는가? -> 그렇지 않다.
- 왜? -> 아래 그림을 보자.
- 위의 그림처럼 short형으로 cArr을 바라봤을 때 {1, 1} 안에 있는 1과 1을 모두 바라보게 되고,
- 그걸 bit로 표현했을 때 오른쪽 아래의 그림과 같아진다.
- 1byte의 비트가 1로 변환되었을 때 255를 가르키고, 그 다음의 수인 0000 0001 0000 0000 은 256이 된다.
- 그 다음 맨 오른쪽 1byte부분도 1을 가지고 있으므로 0000 0001 의 비트를 10진수로 표현하면 1이다.
- short는 16개의 bit를 가지므로,
- 즉, 0000 0001 0000 0001 이라는 비트의 표현을 한 pS는 iData에 대입이 되고 그걸 10진수로 풀면 (256 + 1 인)257이 되는 것이다.
댓글 남기기