July 28, 2008

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);
}

July 09, 2008

Google의 작명 센스

잘 알려진 메모리 문제인 copy constructor와 assign constructor를 Google의 open source에서는 다음과 같은 이름으로 해결하고 있다. 작명 센스가 너무 마음에 든다^^

#define GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TypeName) \
TypeName(const TypeName&); \
void operator=(const TypeName&)

Header file and static variable in C

보통 header file에 #ifdef를 이용해서, header file이 여러번 include되는 것을 막는다. 여기서 조금 햇깔릴 수 있는 것이. 유의할 점은 이러한 과정이 전체 project 별이 아니라, 각 source file 별로 일어난 다는 것이다. 그렇기 때문에, header file에 static global variable을 정의 하게 되면 각 source file 별로 static variable이 생기게 되기 때문에 의도했던 global variable로의 역활을 할 수 없게 된다. C에서 전체 project에서 공유하기 위한 목적으로 global variable을 만들고자 할 때는, source file에서 global variable을 정의하고, 사용하는 곳에서 extern으로 해당 variable을 참조하도록 하는 것이 올바른 방법이다.

July 02, 2008

오늘 본 가슴에 와닿는 말

누군가를 좋아한다는건 그런거에요.
잘못한게 없더라도 미안한마음.
좀 더 잘해주지 못해 아쉬워하는 마음.