NULL 포인터와 런타임 에러
포인터를 사용할때 자주 생기는 런타임 에러와 이를 방지하기 위한 NULL 포인터에 대해 알아보자.
보통 변수는 초기화를 사용하지 않으면 쓰레기 값이 들어감. 이건 그냥 수라서 문제가 없지만, 만약 포인터 변수에 쓰레기값이 들어간다면? 이건 어딘가의 주소이기 때문에 문제의 여지가 크다.
이 경우엔 컴파일도 안해준다…
그렇다고 포인터 변수에 그냥 1234라고 값을 넣는다면? 주소를 1234라고 막 지정하면… 제대로 된 값이 안나온다. 이때는 빌드는 되지만 main함수가 정상적으로 0으로 종료가 안된다.
1234는 우리가 만드는 프로세스가 사용하도록 할당된 주소가 아니기 때문에 OS가 종료해버리기 때문.
아무집이나 막 두드려서 죄송합니다..
이런 오류가 동적할당을 배우고, 자료구조에서 링크리스트등을 따라다닐때 자주 나타난다.
우리가 포인터를 사용할때는 포인터 변수에 확실한 값을 넣어주는게 아니라 다음처럼 런타임동안에 값이 결정되는 경우가 있다.
int b;
scanf("%d, &b")
if (b & 2 == 0)
safer_ptr = &a;
그래서 대부분의 C프로그래머들이 사용하는 방법으로 포인터 변수가 선언되자마자 NULL을 넣어줌. C++에서는 아예 Nullptr이란게 도입되었음. 예전에는 NULL 대신 0을 넣어하기도 함.
int* safer_ptr = NULL;
int a = 123;
int b;
scanf("%d, &b");
if (b & 2 == 0)
safer_ptr = & a;
이 NULL포인터는 포인터를 사용해도 되는지 여부를 알려주기도 함. 포인터의 값이 NULL이면 쓰지 말라는 의미겠지?
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
디버거로 메모리 들여다보기