[C Question] 포인터 형변환 기초 문제

Date:     Updated:

카테고리:

태그:

ideone으로 가기

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);
정답 & 풀이
  1. short형으로 만들어진 sArr의 배열을 pI의 변수는 int형 포인터로 보고 있다.
  2. 이 말은 배열의 크기가 2byte 씩 차지하고 있었지만 pI는 4byte로 보고 있다는 것이다.
  3. 여기까지 정리하면 pI는 sArr 이라는 변수와 마찬가지로 배열의 첫번째를 보고 있는 것까지는 동일하나, sArr는 2byte씩 보고있고, pI는 4byte씩 보고 있다는 뜻이다.
  4. pI 에게 +2 를 해준다면 다음 다음 주소 값을 보고 있게 된다. ( 이 부분은 그림으로 나타내는 것이 이해하기 쉬우니 그림을 첨부하자. )
    • image
    • 위의 그림을 보면 pI는 주소값에 +1을 할 때마다 4byte씩 건너뛰게 되고, sArr은 2byte씩 건너뛰게 된다는 것을 알 수 있다.
  5. 그러므로, pI+2의 값은 4와 5사이에 있는 주소값에 도착했다고 볼 수 있다.
  6. 여기서 short으로 다시 캐스팅을 해주었다 (= A의 상황), 만약 그렇지 않다면? (= B의 상황) 아래 그림으로 보자
    • image
    • 위의 그림처럼 강제캐스팅을 한 A는 그대로 5의 값을 표현할 수 있지만,
    • 강제 캐스팅을 하지 않는 상황(= B)이라면? 값은 단번에 예상하기가 힘들다.
    • 왜 예상하기 힘든지는 2번문제로 이어진다 !

2. 포인터의 형변환 주의할 점

	char cArr[2] = { 1, 1 };
	short* pS = (short*)cArr;

	iData = *pS;

	printf("2번 문제 정답 : %d\n", iData);
정답 & 풀이
  1. 이번에는 1번문제와 다르게 값을 출력할 때 원래 자료형은 char 형으로 변환하지 않고 short형으로 그대로 뽑으려했다.
  2. 값이 1번문제처럼 표현할 수 있는가? -> 그렇지 않다.
  3. 왜? -> 아래 그림을 보자.
    • image
    • 위의 그림처럼 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이 되는 것이다.

c-question-lv1 카테고리 내 다른 글 보러가기

댓글 남기기