안녕하세요 삽잡이입니다.
이번 시간에는 NULL과 0의 차이점에 대해서 알아보려고 합니다.
저와 같은 개발 공부에 관심을 가지고 있는 햇병아리(?)들은 흔히들
char* s = 0; 처럼 변수를 초기화 하곤 합니다.
해당 코드는 '문자열을 담는 변수 s의 주소는 0이다.' 라고 말할 수 있습니다.
그렇다면, char* s = NULL; 과 char* s = 0; 은 과연 어떤 차이가 있을까요?
정답부터 말씀드리자면, 같은 기능을 담당하고 있습니다.
흠... 0과 NULL은 같다는 것처럼 들리는데요?
우선 0은 정수입니다. 맞습니다. 숫자입니다.
NULL은 포인터입니다. 사실 주소는 주소인데 0 주소라고 정의할 수 있습니다.
사실 NULL의 원형은 (void *) 형식으로 정의되어 있다는 말입니다.
따라서, 주소가 없다라고 말 할 수 있다는 것입니다.
우리는 메모리의 위치를 주소라고 부릅니다.
또한, 해당 주소에는 각각 보관되어 있는 값들이 있을 것입니다.
이때 0 주소를 뜻하는 것이 바로 NULL 이라고 하는 것입니다.
일반적으로 0 주소부터 0xFFFF까지는 예약되어 있는 주소입니다.
사용할 수 없도록 널 포인트 트랩으로 예약되어 있다는 것입니다.
따라서, 사용할 수 없는 주소입니다. 즉, 접근 시도를 할 경우 접근을 할 수 없도록 한다는 것입니다.
다시 말씀드리자면,
char* s = NULL; 이나 char* s = 0; 혹은, int** pp = NULL; 이나 int** pp = 0;
이와 같은 변수 초기화는 모두 같다는 뜻입니다.
위의 초기화에서 0은 0 주소라는 것을 알고 있다는 가정하에 쓰는 초기화라는 것입니다.
NULL은 NULL을 위한 헤더를 incude 해야하기 때문에 요즘은 그냥 0으로 초기화하는 추세라고 합니다.
하지만, 주의해야할 점이 있습니다.
int n = 0; 과 int n = NULL 은 같을까요?
아닙니다. 여기서 int n은 정수 0을 넣으라는 뜻이고,
후자는 주소 0을 int형 변수에 넣으라는 뜻이기 때문에 이와 같이 사용을 해서는 안됩니다.
이왕 알아보는 김에 \0, NULL 문자열인 "" 도 추가적으로 알아가보도록 하지요...
'삽질의 현장 > - ETC' 카테고리의 다른 글
[삽잡이] 유니코드와 멀티바이트코드 (0) | 2015.09.25 |
---|---|
[삽잡이] 유니코드(Unicode) (0) | 2015.09.25 |
[삽잡이] 개발 잘하는 방법 (코딩 잘하는 방법) (2) (0) | 2015.07.25 |
[삽잡이] 개발 잘하는 방법 (코딩 잘하는 방법) (1) (0) | 2015.07.24 |
[삽잡이] 시그니처란? (0) | 2015.06.24 |