C 프로그래밍에서 널 포인터 사용하기

CBeginner
지금 연습하기

소개

널 포인터 (null pointer) 는 어떤 메모리 주소도 가리키지 않는 포인터입니다. C 프로그래밍에서 널 포인터는 stdio.h 헤더 파일에 정의된 상수 NULL 로 표현됩니다. 널 포인터를 사용하면 오류를 방지하고 C 프로그램에 기능을 추가하는 데 도움이 될 수 있습니다.

이 Lab 에서는 널 포인터에 대해 배우고 C 프로그래밍에서 이를 사용하는 방법을 배웁니다. 널 포인터를 사용하여 배열에서 이름을 검색하는 프로그램을 만들 것입니다.

참고: 코딩을 연습하고 gcc 를 사용하여 컴파일하고 실행하는 방법을 배우려면 직접 ~/project/main.c 파일을 생성해야 합니다.

cd ~/project
## create main.c
touch main.c
## compile main.c
gcc main.c -o main
## run main
./main

널 포인터 선언하기

C 프로그래밍에서 널 포인터는 아무것도 가리키지 않는 포인터입니다. 널 포인터를 선언하려면 NULL 값을 포인터 변수에 할당할 수 있습니다.

#include <stdio.h>

int main() {
   int *ptr = NULL;    // ptr is a NULL pointer
   return 0;
}

void 포인터 선언하기

void 포인터는 특정 타입이 없는 포인터입니다. 이는 모든 타입의 데이터를 가리키는 데 사용될 수 있습니다. void 포인터를 선언하려면 별표(*) 앞에 키워드 void를 사용합니다.

void 포인터는 역참조되거나 포인터 연산에 사용되기 전에 다른 데이터 타입으로 형 변환(cast)되어야 합니다.

#include <stdio.h>

int main() {
   int n = 10;
   void *ptr = &n; // ptr은 int를 가리키는 void 포인터입니다
   printf("Value of n: %d\n", *(int*)ptr); // 역참조 전에 int 포인터로 형 변환합니다
   return 0;
}

포인터 배열 끝을 표시하기 위해 Null 포인터 사용

C 프로그래밍에서 널 포인터를 사용하여 포인터 배열의 끝을 표시할 수 있습니다. 이는 배열에서 이름 또는 기타 데이터를 검색할 때 유용할 수 있습니다.

#include <stdio.h>
#include <string.h>

int search(char *ptr[], char* name);

char *names[] = {
    "John",
    "Peter",
    "Thor",
    "Chris",
    "Tony",
    NULL
};

int main(void)
{
    if(search(names, "Peter") != 1)
    {
        printf("Peter is in the list.\n");
    }

    if(search(names, "Scarlett") == -1)
    {
        printf("Scarlett not found.\n");
    }

    return 0;
}

// define the search function
int search(char *ptr[], char*name)
{
    for(int i=0; ptr[i]; ++i)
    {
        if(!strcmp(ptr[i], name))
        {
            return i;
        }
    }

    return -1;  // name not found
}

사용자 입력을 위한 프로그램 사용자 정의

사용자가 배열에 이름을 입력하고 이름을 검색할 수 있도록 프로그램을 사용자 정의할 수 있습니다. 이는 C 프로그래밍에서 scanf() 함수를 사용하여 수행할 수 있습니다.

#include <stdio.h>
#include <string.h>

#define MAX_NAMES 100

int search(char *ptr[], char* name);

int main(void)
{
    char *names[MAX_NAMES];
    char name[50];
    int count = 0;

    printf("Enter names (press enter to stop):\n");

    // get names from user input
    while(1)
    {
        scanf("%s", name);

        if(strcmp(name, "") == 0)
        {
            break;
        }

        names[count] = (char*) malloc(strlen(name)+1);
        strcpy(names[count], name);
        count++;
    }

    names[count] = NULL;    // mark end of array with null pointer

    // search for names
    while(1)
    {
        printf("Enter name to search for (press enter to stop):\n");
        scanf("%s", name);

        if(strcmp(name, "") == 0)
        {
            break;
        }

        int index = search(names, name);

        if(index != -1)
        {
            printf("%s is found in index %d.\n", name, index);
        }
        else
        {
            printf("%s not found.\n", name);
        }
    }

    return 0;
}

// define the search function
int search(char *ptr[], char*name)
{
    for(int i=0; ptr[i]; ++i)
    {
        if(!strcmp(ptr[i], name))
        {
            return i;
        }
    }

    return -1;  // name not found
}

요약

이 랩에서는 널 포인터 (null pointer) 와 C 프로그래밍에서 이를 사용하는 방법에 대해 배웠습니다. 널 포인터와 void 포인터를 선언하는 방법, 그리고 널 포인터를 사용하여 포인터 배열의 끝을 표시하는 방법을 살펴보았습니다. 또한 사용자 입력을 허용하고 널 포인터를 사용하여 이름을 검색하도록 프로그램을 사용자 정의하는 방법도 배웠습니다. 프로그램에서 널 포인터를 사용함으로써 프로그램을 더욱 강력하게 만들고 일반적인 오류를 방지할 수 있습니다.