포인터의 크기는 애플리케이션의 호환성과 다른 환경으로의 이식 가능성을 고민할때 문제가 된다. 최근에 널리 사용되는 대부분의 운영체제 환경에서 포인터의 크기는 일반적으로 포인터 타입에 상관없다. 예를 들면 char에대한 포인터는 구조체에 대한 포이터와 크기가 같다. C표준에서 모든 데이터 타입에 대한 포인터의 크기가 같아야 한다고 명시하고 있지는 않지만, 일반적으로 포인터의 크기는 동일하다. 하지만 함수에 대한 포인터와 데이터에 대한 포인터의 크기는 다를 수도 있다.



포인터의 크기는 사용하는 장비와 컴파일러에 따라 다르다. 예를 들어 윈도우버전에서 포인터의 크기는 32 또는 64bit이며 오래된 dos 그리고 왼도우 3.1 os에서 포인터는 16또는 32비트다.




1. 메모리 모델

- 64bit 컴퓨터 도입으로 C기본 데이터 타입의 메모리 크기 차이가 활실해졌다. 컴퓨터와 컴파일러들은 c 기본 데이터 타입의 메모리 할당을 위해 저 마다 다른 옵션의 메모리 모델을 가지고 있다. 이 메모리 모델들을 설명하기 위해 일반적으로 아래와 같은 표기법을 사용한다.



I In L Ln LL LLn P Pn



각 대문자는 정수(Integer), 롱(Long), 포인터(Pointer)에 해당하며, 각 소문자는 타입에 할당된 비트 수다. 


 C Data Type

LP64 

ILP64 

LLP64 

ILP32 

LP32 

char 

short

16 

16 

16 

16 

16 

__int32 

 

32 

 

 

 

int 

32 

64 

32 

32 

16 

long 

64 

64 

32 

32 

32 

long long 

 

 

64 

 

 

pointer 

64 

64 

64 

32 

32 




2. 사전 정의된 포인터 관련 데이터 타입

- 포인터를 다룰 때 다음 네가지의 사전 정의된 데이터 타입이 종종 사용된다


1) size_t -> 안전한 크기 타입 제공을 위해 사용

2) ptrdiff_t -> 포인터 연산을 처리하기 위해 사용

3) intptr->t와 uintptr_t -> 포인터 주소를 저장하기 위해 사용



3. size_t 타입에 이해

- size_t 타입은 c언어에서 임의의 객체가 가질 수 있는 최대 크기를 나타낸다. 크기를 표현하는데 음수의 사용은 의미가 없기 때문에 size_t는 부호 없느 ㄴ정수를 사용한다. size_t 타입을 사용하은 이유는 시스템에서 주소 지정이 가능한 메로리 영역과 일치하는 크기를 선언하는 이식 가능한 방법을 제공하기 위해서이다. 


malloc 함수와 strlen 함수가 size_t타입을 반환하는 인자로 사용되는 대표적인 함수이다. 일반적으로 32 system에서는 32bit, 64 system에서는 64bit이다. 



4. 포인터와 sizeof연산자 사용하기

- 포인터의 크기를 확인하는데 sizeof 연산자를 사용할 수 있다. 아래 코드는 char 포인터에 대한 크기를 출력한다.


printf("Size of *char: %d", sizeof(char*));


결과:

size of *char: 4


함수 포인터의 크기는 다를 수 있다. 보통의 주어진 환경의 운영체제와 컴파일러 조합에따라 결정된다 많은 컴파일러는 32비트나 64비트 애플리케이션 생성을 지원하며 같은 프로그램도 컴파일 옵션에 따라 다른 포인터 크기를 가진다. 



5. intptr_t uintptr_t 사용하기

- intptr_t와 uintptr_t 타입은 포인터의 주소를 저장하는데 사용된다. 이 두 타입은 다른 환경으로 이식이 가능하고 안전한 포인터 선언 방법을 제공하며, 시스템 내부에서 사용하는 포인터와 같은 크기다. 포인터를 정수 표현으로 변환할때 유용하게 사용할수 있다. 


uintptr_t타입은 intptr_t 타입의 부호 없는 버전에 해당된ㄷ. 대부분의 연산에서 intptr_t 타입을 사용하는 것이 좋으며, uintptr_t 타입은 intptr_t 타입만큼 유연하지 않고 사용이 제한적이다. 아래는 intptr_t 타입의 사용 방법을 보여준다.


int num;

intptr_t *pi = #


다음의 코드를 실행하면 문법 에러가 발생한다.


uintptr_t *pu = #


error: invalid converstio nfrom 'int*' to 'uintptr_t* {aka unsigned int*}'


위의 에러는 타입이 맞지 않아 생기는 에러이다. 캐스팅을 해주면 정상 할당된다.


uintptr_t *pu = (uinttpr_t *)#

'C' 카테고리의 다른 글

[C언어] 열거형 enum  (0) 2018.08.24
[C언어] 구조체와 공용체 (struct, union)  (0) 2018.08.24
c언어 배열  (0) 2018.07.22
C언어 산술, 관계, 논리연산자  (0) 2018.07.22
C언어 포인터 기초 개념  (0) 2018.07.14

+ Recent posts