#include
#include
int main(void)
{
int a, b, *p = &a, *p = &b;
ptrdiff_t diff = p - q;
printf("diff = %d\n", diff);
return 0;
}
ANSI C에서, 두 포인터 수식의 차는 부호있는 정수적형이어야 한다. 대부분의 UNIX 시스템에서 그 형은 int이고, 대부분의 MS-DOS 시스템에서 그 형은 long이다. 모든 ANSI C 시스템에서, 그 형은 표준 헤더 파일 stddef.h에 다음과 같은 형 선언으로 주어진다.
typedef type ptrdiff_t;
현재 사용하고 있는 시스템의 stddef.h에서 이 typedef를 찾아보면, diff의 형을 알게 될 것이다. diff가 int형이면 printf() 문에서 %d가 적절할 것이고, long 형이면 %ld가 적절할 것이다. 이 프로그램을 수행한 후 그 효과를 이해하여라. 그 후 프로그램에 다음과 같은 두 행을 추가하여라.
diff = p - (int *)0;
printf("diff = %d\n", diff);
기대했던 출력값이 나왔는가? 이것을 통해 연습문제 2번에서 논의한 컴파일러의 경고가 발생한 이유를 이해하겠는가? 설명하여라. 만일 int *를 ptrdiff_t *로 대치한다면, 프로그램은 다르게 동작하겠는가?
내 컴에 깔린 cygwin gcc를 확인해보면
#ifndef __PTRDIFF_TYPE__
#define __PTRDIFF_TYPE__ long int
#endif
typedef __PTRDIFF_TYPE__ ptrdiff_t;
ptrdiff_t는 long int 데이터 타입이다.
...
단순히 ptrdiff_t는 long 타입의 데이터 형이다.
포인터 연산 결과가 오버 플로우 되는것을 방지하기 위한건가?
포인터 연산의 결과는 데이터 형의 갯수로 평가되는데...굳이 이럴 필요가 없다고 생각되는데...
하긴 char 타입의 경우엔 필요할 수도 있겠군.
일단 여기까지만 생각.
댓글 없음:
댓글 쓰기