[C/C++]NULL, NUL, 0, \0  의 차이점을 알아보자.
Language/CㅣC++

[C/C++]NULL, NUL, 0, \0 의 차이점을 알아보자.

 

코드를 짜다보니 NULL , NUL, 0, \0 이것들의 차이점이 문득 궁금해졌습니다. 

인터넷을 뒤져보니 이미 많은분들이 이것들의 차이점에 대해 적어 놓으셨더라구요. 헷갈릴 수있는 것들이기에 자세하게 정리해 보았습니다.

 

NULL 혹은 0

먼저 NULL 부터 알아보겠습니다. NULL은 헤더파일에 정의된 매크로로 null pointer constant입니다.  컴파일러에 의해 (void*)0 으로 정의되어집니다.

일반적으로 C언어에서 stdio.h 파일, C++에서 iostream 헤더파일을 include 시에 사용할 수 있습니다.  NULL은 0 주소를 의미하기 때문에 포인터 변수를 초기화 시에 사용합니다. 

예를들어 ..

char *ptr = NULL 과 char *ptr = 0 은 같은 의미라 볼 수 있습니다. 

그러나 int a = NULL 과 int a = 0 의 의미는 다릅니다.

왜냐하면 전자의 경우, NULL의 의미는 a 변수에 주소값 0 을 넣는것이고 후자는 정수 0을 a변수에 넣는다는 뜻입니다.

결론적으로 NULL은 0이랑 의미가 거의 같습니다. 포인터를 초기화 시에 0은 0 주소라는 것을 알고 있다는 가정하에 쓰기 때문에 NULL과 0의 의미를 동일하게 보는것입니다. 정수형 변수를 초기화시에 NULL을 쓰는 일은 없으니까요.

 

NULL - 0x00000000 or 0x00000000'00000000 (32 vs 64 bit) 로 표현됩니다.

 

NUL 혹은 \0

먼저 아스키 코드 표를 봅시다. 바로 첫번째 자리에 NUL 이 보입니다. 

 

문자열을 표현할때는 문자열의 끝을 의미하는 문자인 '\0' 이 삽입됩니다. 이 문자를 가리켜 널(null) 문자라하며 아스키코드값 0에 해당. symbol(name)은 NUL 입니다. 

숫자 0과 구분해주기 위해 '\0'으로 사용합니다. 문자 0은 아스키 코드값 0x30 이죠 엄연히 0이랑 다릅니다. 

자동으로 초기화된 문자열 다음에 null문자(\0)가 삽입되는건 다들 아실겁니다. 신기한건 프로그래머가 직접 넣어줄 수도 있습니다. 

#include<stdio.h>

void main() {

	char str[6] = "Hello\0"; // strlen(str) = 5, sizeof(str) = 6 (한개의 NUL) 
	char str[7] = "Hello\0"; // strlen(str) = 5, sizeof(str) = 7 (두개의 NUL) 
	char str[5] = "Hello\0"; // 컴파일 에러 (1) 
	char str[6] = "Hello\0"; // 컴파일 에러 (2) 
    
}

 

이런식으로 추가가 가능합니다. 이런식의 프로그램은 검색을 해보니 권장하지 않는 방법인듯합니다.

(1) 번째 컴파일 에러인 경우에는 변수의 크기보다 값이 더 크기 때문에 컴파일 에러가 발생합니다. (2) 번째 경우에는 값의 크기와 변수공간의 크기는 같으나 컴파일러가 자동으로 넣어주는 '\0' 을 넣을 자리가 없어서 컴파일 에러가 발생합니다.

NUL - 0x00 or 0x0000 (ASCII vs 2byte unicode)

'\0' - 0x00  '0' - 0x30  (ASCII)

 

\0과 0에 해당하는 아스키코드 값을 보시면 이해가 빠르실겁니다.