31.7 잘못된 포인터 사용

포인터는 메모리 주소를 저장하는 용도이므로 다음과 같이 값을 직접 저장하면 안 됩니다.

invalid_pointer.c

#include <stdio.h>

int main()
{
    int *numPtr = 0x100;    // 포인터에 0x100을 직접 저장

    printf("%d\n", *numPtr);    // 0x100은 잘못된 메모리 주소이므로 실행 에러

    return 0;
}

소스 코드를 컴파일해서 실행해보면 제대로 실행이 되지 않습니다. 왜냐하면 int *numPtr = 0x100;과 같이 포인터에 직접 0x100을 저장했을 때 메모리에서 0x100은 잘못된 주솟값이기 때문입니다.

그림 31-26 잘못된 포인터 사용

이 상태에서 numPtr을 역참조하여 메모리 주소에 접근해 봐야 에러만 발생합니다(운영체제는 프로그램이 잘못된 메모리 주소에 접근했을 때 에러를 발생시킵니다).

만약 실제로 존재하는 메모리 주소라면 포인터에 직접 저장할 수 있습니다.

int *numPtr = 0x00CCFC2C;    // 실제로 존재하는 메모리 주소라면 저장할 수 있음

보통 임베디드 시스템이나 마이크로 프로세서에서 제공하는 메모리 주소를 사용할 때 포인터에 직접 저장하기도 합니다.

지금까지 포인터의 사용 방법에 대해 배웠는데 메모리와 주소 등 초보자에게 생소한 개념들이 나와서 조금 어려웠습니다. 따라서 지금 당장 모든 내용을 익힐 필요는 없습니다. 이해가 되지 않는다면 포인터 선언과 역참조 문법만 외워서 사용해도 됩니다(저도 처음 배울 때 그랬으니까요). 나중에 C 언어에 익숙해지면 포인터 개념은 자연스럽게 습득하게 됩니다.