널포인터(NULL Pointer)


1. 포인터의 초기화
소스 코드의 작성 시 중요한 것이 변수 선언시 초기화를 해 주는 것이다. C언어의 문법 특성상 변수 선언시 초기하지 않고 필요시 값을 대입해서 사용해도 문제가 되지 않는다. 하지만 가능한 초기화를 해 주는 것이 좋다.

포인터는 메모리상의 존재하는 변수나 함수를 가리키기 위해 그 주소를 보관하게 된다. 포인터의 초기화를 하지 않으면 아무것도 가리키고 있지 않다. 초기의 값이 대입되지 않은 변수를 우리가 알듯이 쓰레기 값을 가지고 있다. 쓰레기 값고 아무것도 가리키지 않는 것은 차이가 있다.

만일 어떤 대상의 주소를 가리키다가, 더이상 가리키고 싶지 않을때는 어떡해 해야 할까요? 이미 포인터에는 이전에 가리키는 대상의 주소가 존재하는데 말이죠. 이럴때 사용하는 것이 널 포인터 입니다.



2. 널포인터 선언
널 포인터는 NULL로 표기한다. 정의는 선행처리기 #define 을 사용하여 #define NULL 0 으로 선언되어 있다. 널 포인터가 0으로 선언되고 있다고 했지만, 개발환경/컴파일러마다 차이가 있다. 따라서 값(0)을 직접사용하지 말고 NULL이라는 매크로 상수를 사용하는 것이 바람직 하다.

char* ptr = NULL;
printf("%d", ptr);
위의 출력은 0이 된다.

널 포인터는 포인터의 초기화 시에 주로 사용한다. 다음과 같이 포인터가 아무것도 가리키지 않는 다는 것을 나타낸다.
int* ptr = NULL;

또는 포인터가 어디를 가리키고 있는지 확인할 수 있다.
if (ptr == NULL) {
          // 가리키는 곳이 없다.
} else {
         // 가리키는 곳이 있다.
}
참고로, if(ptr != NULL) 대신 if(!ptr)로 종종 줄여서 사용하기도 한다.

다음과 같이 에러 발생 유무를 체크하기 위해서도 사용된다.
int* ptr = (int *) malloc(5*sizeof(int));
if (ptr == NULL) {
        // 메모리가 생성되지 않았음
}

fopen()함수를 이용해 파일을 오픈했을때 파일열기에 실패했을때도 NULL포인터를 반환한다.
if (fopen("test", "r") == NULL)
{
       // 파일열기 실패
}


Reference : C/C++ 개발자를 위한 KIN 포인터 실무

[프로그래밍/_ C/C++] - [C언어] 포인터와 const 키워드
[프로그래밍/_ C/C++] - [C언어] void 형 포인터
신고
Posted by Proneer

댓글을 달아 주세요

  1. 언어 습득은 보통 자신의 모국어의 유아 '인수를 연구 모국어 획득,를 의미합니다. 이것은 다른 언어의 인수 다루는 두번째 언어 습득에서 구별된다. 감사합니다.

    2012.09.11 15:19 신고 [ ADDR : EDIT/ DEL : REPLY ]
  2. 무슨 한국말을 영어로 번역하고 다시 한국말로 번역한것같이 읽기가 굉장히 힘드네요

    2017.10.12 13:50 신고 [ ADDR : EDIT/ DEL : REPLY ]


티스토리 툴바