반응형

http://bravedog.blog.me/100005576789

프로그램 개발환경이 WIN32로 바뀌면서 의미를 잃어버린 포인터들이 있다. 이것이 near 및 far포인터이다. 하지만 예전의 소스를 해석하다 보면 심심찮게 볼 수 있다. 예전의 16비트 OS들은 메모리를 세그먼트(16bit):옵셋(16bit)의 형태로 다루었다. 옵셋을 사용하여 접근할 수 있는 메모리 공간은 64KB가 되고 세그먼트와 옵셋을 모두 사용할 경우 접근할 수 있는 메모리 공간은 총 1MB가 된다.

 

터보 C에서는 디폴트로 스몰모델(small model)의 컴파일을 사용한다. 이것은 옵셋만의 변화로 메모리에 접근하는 방식으로써 앞서 말한 바와 같이 64KB의 메모리 공간에 할당이 된다. 하지만 필요에 따라서 더 많은 메모리가 필요할 경우 터보 C에서는 near와 far키워드를 사용하여 접근할 수 있다.

 

near 포인터는 64KB용, far 포인터는 1MB용으로 스몰모델에서는 데이터의 기본형을 모두 near형으로 가정하기 때문에 near는 쓰지 않아도 된다.

 

int far *fp;              // fp는 1MB 메모리 영역용 far 포인터

int near *np;          // np는 64KB 메모리 영역용 near 포인터

 

단, far 형 포인터에 메모리번지를 대입할 때는 long형 정수를 사용해야 한다. long형 정수(4바이트)중 앞의 2바이트는 세그먼트를, 뒤쪽의 2바이트는 옵셋을 나타낸다.

 

np=0x1234;             // np 옵셋(0x1234)

fp=0x20001234L;      // fp는 세그먼트(0x2000):옵셋(0x1234)

 

뒤에 설명할 동적 메모리에 관한 함수들은 모두 far 포인터 형 함수를 별도로 가지고 있다. far 포인터 형 함수는 unix와 ansi c에서는 제공이 되지 않고 도스와 윈도우에서만 사용하였지만 최근에는 WIN32로 환경이 바뀌면서 사용하지 않게 되었다. 좀더 상세히 말하면 near포인터와 far포인터는 windef.h파일에 정의되는데 win32로 바뀌면서 빈 문장열로 처리하도록 변경되었다.

 

참고로 기존의 16비트 OS환경에서의 메모리 관련 far 포인터 형 함수의 원형들은 다음과 같다.

 

near 형far 형
mallocvoid far *farmalloc(unsigned long nbytes);
callocvoid far *farcalloc(unsigned long nunits, unsigned long nunitz);
reallocvoid far *farrealloc(void far *oldblock, unsigned long nbytes);
freevoid far *farfree(void far *block);
memsetvoid far *far_fmemset(void far *s, int c, size_t n);


http://goo.gl/PJqZm


far 포인터(far *)인 경우에는 L로 시작합니다 - LPVOID





반응형

+ Recent posts