ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C Language] 41. 포인터의 개념을 깨는 '0'
    CSE/C Language 2015. 8. 5. 13:47

    지금까지 배운 포인터에 대한 개념으로 설명이 불가능한 프로그램이 있다. 아래 예제를 보도록하자.



    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    /*
     * 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. 널 포인터의 사용 용도

     아무것도 가리키지 않는 포인터를 도대체 어디에 써먹는가? 의아해 하겠지만 널 포인터는 이미 여러분이 알게 모르게 많이 사용하고 있는 개념이다.

     

     - 에러 처리

     - 매개변수의 마지막을 알릴 때


     에러 처리

      

     

    1
    2
    if ((fp = fopen("temp""r")) == NULL)
        exit(0);
    cs



      fopen()을 사용하여 'temp' 파일을 개방하려고 했는데, 현재 디렉터리에 'temp' 파일이 존재하지 않아서 fopen() 함수가 널 포인터를 리턴한 것이다.







    1
    2
    3
    if ((temp = (char *)malloc(1024)) == NULL)
        exit(0);
     
    cs


      1024 bytes의 메모리를 확보하려 했지만 실패했을 경우에 널 포인터가 리턴된다.



     매개변수의 마지막을 알릴 때


      매개변수의 마지막을 위한 널 포인터 예제이다.



    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    /*
     * 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









     





    댓글

Designed by Tistory.