작은숲:위키노트/초보자를 위한 C 언어 강의/널 문자와 널 포인터
프로그래밍 언어에서 null이라는 것은 조금 특별한 의미를 갖는다. 이 null이라는 것은 0을 의미하고 있다. 그럼 C 언어에서 널 문자와 널 포인터는 과연 어떤 차이가 있을까?
널 문자(Null character)는 말 그대로 문자이다. 문자는 문자인데, 값이 0인 문자를 말한다. 일반적으로 문자는 그 문자에 해당되는 ASCII 코드값을 가지고 있다. 그런데 이 널 문자는 일반 문자와는 다른 일을 하기 위해 0이라는 값을 가지고 있다. 하지만 다른 문자와 마찬가지로 데이터형은 char 형입니다. 그리고, 널 문자는 '\0'으로 표현한다.
이 널 문자는 문자열에서 제대로 힘을 쓴다. 바로 문자열의 끝을 표현하기 위해 이 널 문자를 사용한다. 즉, 아래와 같은 두 문장이 있다면 이것들은 완전히 같은 것이다.
char str[] = "String";
char str[] = { 'S', 't', 'r', 'i', 'n', 'g', '\0' };이와 같이 문자열에는 반드시 그 끝을 알려주는 널 문자가 들어있어야 한다. 그렇다면 아래와 같은 경우는 문자열이 아닐 것이다.
char str[] = { 'S', 't', 'r', 'i', 'n', 'g' };지금 이 코드가 위에서 나온 것과 다른 점은 끝에 널 문자가 없다는 것이다. 이렇게 널 문자가 있느냐 없느냐에 따라 이게 문자열이 되느냐 안되느냐는 것이 결정된다. 따라서, 문자열에서 널 문자는 아주 중요한 일을 한다고 할 수 있다.
그럼 널 포인터(Null pointer)는 무엇일까? 널 포인터는 말 그대로 포인터이다. 즉, 널 문자와는 전혀 다른 것이다. 널 포인터는 주소 0을 가지고 있는 포인터이다. 이 널 포인터를 표현하기 위해 NULL을 사용하는데, 이것은 stdio.h 파일에 아래와 정의되어 있다.
#define NULL ((void *) 0)그래서 이 널 포인터는 포인터 중에서도 좀 특별한 포인터가 되는 것이다. 일반적으로 이 널 포인터는 포인터를 리턴해주는 함수들에서 에러가 생겼음을 표현해주기 위해 사용된다. 대표적인 예로 malloc() 함수에서 메모리 할당을 실패했을 때 NULL 포인터를 되돌려준다. 그래서 우리는 이 리턴되는 값을 보고 제대로 할당이 됐는지 판별할 수 있다.
또 다른 예로는 파일을 열 때 사용하는 fopen() 함수를 생각할 수 있다. fopen() 함수도 파일(스트림)을 여는데 실패하면 NULL을 리턴하게 되어 있다.
이처럼 널 문자와 널 포인터는 이름이 비슷한 것처럼 0을 가지고 있다는 점은 같지만 가리키는 대상이 다르다. 0이 값인지 주소인지에 따라 널 문자인지 널 포인터인지 구별할 수 있다.