1. 널

 

0과 '\0'과 NULL은 모두 같다

 

다만 0은 숫자이고 0의 아스키 문자값이 '\0' 인거고

 

NULL은 0으로 define된 매크로 상수이다

 

0과 NULL은 같지만 NULL에 의미를 부여해주기 위해 매크로로 따로 define 한것





0이나 '\0'이나 NULL이나 모두 %d로 찍으면 0이 나오는 것을 알수있다

 

 

2. 널 문자열

 

널문자열은 값이 아무것도 들어있지 않은 빈 문자열을 의미한다.

 

C에서 문자열의 끝은 항상 널로 끝나야 하기 때문에 문자열의 값이라고 하면

 

널을 만나기 전까지의 문자들을 합쳐 문자열이라고 한다.

 

그러니까 값이 아무것도 들어있지 않은 빈 문자열은 널문자만 들어가 있는것을 의미한다

 

한편 값이 아무것도 들어있지 않다고 해서 크기가 없는 것은 아니다

 

널 문자를 저장하기 위한 공간도 할당되어야 하기 때문이다

 

 char str[] = "abcd";


 printf("%d", sizeof(str));

 

여기서 str배열에는 a,b,c,d,\0이 들어간다. 이 배열을 가지고 sizeof 연산을 해보면

 

크기가 4가 아닌 5가 나오는 것을 알 수 있다.

 

 

3. 널 포인터

 

char * ptr = NULL;

 

이러한 선언에서 ptr은 널문자열을 가리키는 포인터가 아니다

 

위의 선언을 보면 ptr에 NULL이 할당되도록 선언을 하고있다.

 

ptr은 char 형 변수의 주소값을 저장할 수 있도록 선언되었는데, 그러니까 ptr에는 char형 변수의 주소

 

값이 들어간다. 즉 ptr은 0번지 주소를 가지게 된다.


(int a = 3; 에서 a는 3을 가지지만 int * a = 3; 에서 a는 3번지 주소를 가진다)


(만약 ptr이 널문자열을 가리킨다면 널문자열에 대한 해당 주소를 가지고 있어야 하겠지)

 

한편 ptr이 가지는 0번지주소는 아무 곳도 가리키지 않는 주소를 의미한다.

 

대부분의 플랫폼에서 0번지는 ROM이거나 시스템 예약 영역에 해당되므로 응용 프로그램이

 

이 번지에 어떤 값을 저장하거나 읽을 수 없도록 보호되어 있다.

 

즉 char * ptr = NULL; 이러한 선언에서 ptr은 0x0번지의 주소를 지니고 있는데

 

0번지 주소는 특별한 공간이기 때문에 ptr을 가지고 이 주소에 접근해서 어떠한 연산이라거나

 

값을 읽는다거나 등을 할 수 없는 것이다. 즉 char * ptr = NULL; 이러한 선언에서


ptr은 아무것도 가리키지 않는 널포인터가 되는 셈이다.

 

만약 ptr이 널 문자열을 가리키는 것이었다면 널 문자열을 위한 메모리공간이 따로 할당되고,

 

그 주소를 ptr이 가지는 형태가 되어야 한다



위 그림에서 ptr은 널문자열을 가리키는 포인터이고 str은 0번지를 가지는 포인터이다.

 

위 그림에서 str은 0번지 주소를 가지고 있으며 바로 밑에 식을 계산할 수 없다는 오류를 볼수있다

 

ptr은 임의의 메모리공간에 널문자를 위한 공간이 만들어지고, 널이 할당되고 그 주소를 ptr이 갖고 있


다. (주소값이 0x0041573c로 메모리에 올라갔다는 것을 알수있다) 

 

마지막으로 널이 문자의 형태로 쓰였을때, 그리고 문자열의 형태로 쓰였을때를 비교해보면



다음과 같다. 똑같은 널 값 이지만

 

%c로 찍으면 공백으로 출력되며 %d로 찍으면 0으로 출력되고 %s로 찍었을땐 0번지의 의미로

 

null이 출력되는 것을 볼 수 있다.

 

------------------------------------------------------



'C > 공개글' 카테고리의 다른 글

printf와 puts와 fputs  (0) 2013.01.23
printf의 서식  (0) 2013.01.23
key sum  (0) 2013.01.23
문자열 뒤집는 알고리즘  (0) 2013.01.23
scanf의 원리와 scan set 기능  (0) 2013.01.22
Posted by huammmm1
,