Chapter 9.포인터의 개념을 깨는'0'
포인터 변수는주소 값을 저장할 수 있는 변수라는 의미이다.
누차 강조했지만포인터 변수에는 주소값 이외에는 어떠한 값도 할당 될 수 없다.
따라서, 포인터 변수에 할당되어 있는 값은 주소 값이 되는 것이다.
9_2.c
#include <stdio.h>
main()
{
char*imsip;
imsip= 0;
}
gcc-o9_2 9_2.c
.9_2
0000000000
널 포인터
어느곳도 가리키고 있지 않는 주소 값, 어느 곳도 가리키지 않는 포인터, 할당되지 않은 포인터를 대표하는 것이 널 포인터다.
따라서, 널포인터를 이용하여 값을 출력하려고 하면 문제가 발생한다.
9_3.c
#include <stdio.h>
main()
{
char *imsip;
imsip = NULL;
printf("%#010x\n", imsip);
}
gcc -o9_3 9_3.c
./9_3
0000000000
널 포인터가 0x00000000을 뜻하는 것을 오인하지말자. 널 포인터는 아무것도 가리키지 않는다고 앞서 얘기했다.
또한, 널포인터와 널 문자를 가리키는 포인터를 같다고생각해서는 안 된다.
널 포인터는 0(ASCII0) 값을 갖고 있으며 널 문자를 가리키는 포인터는 따로 있다.
char *imsip;
imsip = "";//orimsip ="\0";
printf("%#010x\n", imsip);
0x08048460
""은 널문자('\0')이다. 메모리의 어딘가를 차지하고 있는 것이다.
이것을 imsip가 가리키도록 하고 있다. 이것은위와 같이 imsip의 값을 출력해보면 0아닌주소 값이 나오는 것으로 확인할 수 있다.
널포인터의 사용처
1. 에러를 처리할 때
에러의 유무를 판별할 때 유용하다.
if(open("imsi", "r") == NULL) {
perror("fopen");
exit(0);
}
if((imsi = (int *)malloc(sizeof(int)* 10)) == NULL) {
perror("malloc");
exit(0);
}
2. 매개변수의 마지막을 알릴 때
생각보다 많은 사람들이 매개변수의 마지막 인자로 '0'을 택하고 있다.
execl("/usr/bin/ls", "ls", "-l", (char *)0);
위의 수식은 유닉스 시스템호출 함수이다.
매개변수의 개수가 일정치 않은 함수이기 때문에 마지막을 알리는방법이 필요한데 이것이바로 널 포인터인 것이다.
마지막 인자는 가변인자로 기본적으로void형 포인터로 처리되기 때문에0으로 지정하면
'0'은 마지막을 알리는 널 포인터로 사용된0인지 아니면 정수 0을 넘기려고 한 것인지 알 수 없다.
9_4.c
#include <stdio.h>
main(int argc, char **argv)
{
for(;*argv;argv++)
puts(*argv);
}
./9_4
5
7
15
argv는 포인터의 포인터 변수이며 각각은 문자열을 가리키고 있다.
argv[0] ="./9_4", argv[1] ="5", argv[2] = "7", argv[3] = "15", argv[4] =NULL
마지막 인자는 아무것도가리키고 있지 않으므로 이것을 이용하여 argv의 마지막을 판별하게 된다.
주의 할 것은 argv가 가리키고있는 것은 모두 문자열이라는 것이다.
5, 7 15가 모두 문자열로 기억되어 있다는 것을 확인하자.
'C언어' 카테고리의 다른 글
Chapter 7. strcpy()의 비밀 (0) | 2011.10.16 |
---|---|
Chapter 8. 뒤죽박죽 포인터 (0) | 2011.10.16 |
Chapter 4. 문자열과 포인터 (0) | 2011.10.16 |
Chapter 5. 포인터의 포인터 (0) | 2011.10.16 |
Chapter 6. scanf()와 fgets() (0) | 2011.10.16 |