본문 바로가기

C언어

Chapter 9. 포인터의 개념을 깨는 `0`

Chapter 9.포인터의 개념을 깨는'0'

포인터 변수는주소 값을 저장할 수 있는 변수라는 의미이다.

누차 강조했지만포인터 변수에는 주소값 이외에는 어떠한 값도 할당 될 수 없다.

따라서, 포인터 변수에 할당되어 있는 값은 주소 값이 되는 것이다.

9_2.c

#include <stdio.h>

main()

{

char*imsip;

imsip= 0;

printf("%#010x\n", imsip);

}

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