-
[C Language] 41. 포인터의 개념을 깨는 '0'CSE/C Language 2015. 8. 5. 13:47
지금까지 배운 포인터에 대한 개념으로 설명이 불가능한 프로그램이 있다. 아래 예제를 보도록하자.
1234567891011121314151617181920/** nullp.c** Created on: 2015. 8. 5.* Author: Yeonsu*/#include <stdio.h>int main(void) {char *char_p;char_p = 0;printf("%x\n", char_p);return 0;}cs 포인터를 설명할 때 수없이 강조했던 내용이 '포인터 변수에는 주소 값 이외에는 어떠한 값도 할당할 수 없다'라는 것이다. 하지만 위의 프로그램으로 0 이라는 정수 값에 포인터 변수에 할당되고 있으며 컴파일 문제가 발생하지 않는다. 컴파일러는 위의 프로그램을 어떻게 해석하길래 문제가 발생하지 않는 것일까?
컴파일러는 0을 포인터 변수에 할당하는 순간, 이를 자동으로 널 포인터로 인식하여 처리한다. 즉, 0이 포인터화되어 포인터 변수에 할당되기 때문에 문제가 발생하지 않는 것이다. 이때 다른 정수는 해당하지 않는다. 오로지 정수 0만 해당된다. 널 포인터는 다음과 같은 의미를 가진다.
널 포인터는 어떠한 곳도 가리키고 있지 않는 주소 값이다.
1. 널 포인터의 사용 용도
아무것도 가리키지 않는 포인터를 도대체 어디에 써먹는가? 의아해 하겠지만 널 포인터는 이미 여러분이 알게 모르게 많이 사용하고 있는 개념이다.
- 에러 처리
- 매개변수의 마지막을 알릴 때
에러 처리
12if ((fp = fopen("temp", "r")) == NULL)exit(0);cs fopen()을 사용하여 'temp' 파일을 개방하려고 했는데, 현재 디렉터리에 'temp' 파일이 존재하지 않아서 fopen() 함수가 널 포인터를 리턴한 것이다.
123if ((temp = (char *)malloc(1024)) == NULL)exit(0);cs 1024 bytes의 메모리를 확보하려 했지만 실패했을 경우에 널 포인터가 리턴된다.
매개변수의 마지막을 알릴 때
매개변수의 마지막을 위한 널 포인터 예제이다.12345678910111213141516171819/** nullp.c** Created on: 2015. 8. 5.* Author: Yeonsu*/#include <stdio.h>int main(int argc, char **argv, char **env) {for(;*env;env++)puts(*env);return 0;}cs 'CSE > C Language' 카테고리의 다른 글
[C Language] 이클립스 C/C++ 개발 환경 구축 !! (0) 2015.09.16 [C Language] 43. 포인터 - 매개변수 처리 총정리 (0) 2015.08.10 [C Language] 42. void형 포인터 - C 언어 (0) 2015.08.05 [C Language] 40. 문자열 함수 - C 언어 (0) 2015.08.05 [C Language] 39. 포인터의 포인터 - C 언어 (0) 2015.08.05 [C Language] 38. 문자열과 포인터 - C 언어 (0) 2015.08.04