Slashdot 에 올라온 Linus Torvalds Answers Your Questions 에서 Linus가 언급한 Pointer관련 내용을 알아보기 쉽게 정리한 글(Linus on Understanding Pointers)에서 중요한 포인터 활용을 배웠다.

요는 이중포인터,(**)는 포인터의 주소를 가리킨다는 것. 단순하지만 중요하고 명확하다.

예를 들어 아래와 같은 struct가 있다.

typedef struct list_entry {
    int val;
    struct list_entry *next;
} list_entry;

위의 Struct로 구성된 LinkedList를 순환하면서 val 의 값을 비교하여 삭제 하는 기능을 구현 할때 일반적으로 아래처럼 작성될 것 이다.

list_entry *entry = head; /* assuming head exists and is the first entry of the list */
list_entry *prev = NULL;

while (entry) {
    if (entry->val == to_remove)     /* this is the one to remove */
        if (prev)
           prev->next = entry->next; /* remove the entry */
        else
            head = entry->next;      /* special case - first entry */

    /* move on to the next entry */
    prev = entry;
    entry = entry->next;
}

하지만 토발츠는 위와같이 작업한 코드를 보면 '이 사람은 포인터를 제대로 이해하지 못한 사람이구나' 라고 생각한다고 합니다.

아래는 토발츠가 제시한 방법을 위 블로그에서 풀어놓은 코드입니다.

list_entry **pp = &head; /* pointer to a pointer */
list_entry *entry = head;

while (entry) {
    if (entry->val == to_remove)
        *pp = entry->next;

    pp = &entry->next;
    entry = entry->next;
}

위 코드가 원자적으로 동작하고 변수 if 조건절을 사용하지 않고... 등의 내용보다 실제 어떨때 이중 포인터(**)를 사용하는 지를 이해하는데 도움을 주는 코드이자 방법을 알려준 것 같습니다. 아주 간단하게 이중포인터를 이용해서 Atomic 연산을 보장 하도록 한 것이 중요하지만요..

Posted by 지누스

댓글을 달아 주세요



티스토리 툴바