July 17, 2008

double pointer

void **

이렇게 사용되는 pointer variabel을 double polinter라고 부른다. 사용하는 이유는 보통 single pointer variable에 메모리를 할당하기 위함이 일반 적이다. 예를 들어보자.

boolean func(char **ptr, int nSize)
{
if(*ptr != NULL) {
free(*ptr);
}

*ptr = (char *)malloc(sizeof(char) * nSize);

return (*ptr == NULL) ? FALSE : TRUE;
}

위와 같은 형식이 아마도 가장 일반적인 double pointer의 예일 것이다. 종종 위와 같은 기능을 single pointer를 이용하여도 상관없지 않냐는 궁금증을 갖게 되는 경우가 있다. 예를 들어보자.

boolean func(char *ptr, int nSize)
{
if(ptr != NULL) {
free(ptr);
}

ptr = (char *)malloc(sizeof(char) * nSize);

return (ptr == NULL) ? FALSE : TRUE;
}

결과는 전혀 다르다. Pointer variable은 주소를 담는 공간이다. 인자로 전달 받은 char *ptr은 callee가 전달한 주소를 담는 공간이며, local variable 임을 명심하자. 즉, ptr에 malloc을 통해 새로운 pointer를 할당하는 것은 local variable에 malloc을 통해서 새로운 주소를 할당하는 것과 동일한 것이다.

조금 다른 얘기지만, 종종 아래와 같은 오류가 있는 code를 볼 수 있다.

char doubleArray[2][3];
char **ppArray = doubleArray;

기본적인 문법 오류이지만, 실수하기 쉬운 부분이다. 첫번째의 multi-dimensional array의 경우 6개의 char variable이 연속으로 붙어 있는 형태를 가지며, 아래의 double pointer로 표현하고자 하는 multi-dimensional array의 경우, 2개의 char * variable이 연속으로 붙어 있고, 각 variable은 3개의 char variable이 연속으로 붙어 있는 영역을 가리키고 있다. 즉, 두 변 수 모두 multi-dimensional array를 표현하기 위한 의도를 가지고 정의 했지만, 실제로는 아래와 같이 다른 의미를 가지게 된다.

char doubleArray[2][3];
char **ppArray;
ppArray = (char **)malloc(sizeof(char *) * 2);
for(int i = 0; i < 2; i++) {
ppArray[i] = (char *)malloc(sizeof(char) * 3);
}

No comments:

Post a Comment