본문 바로가기

Programming/MFC

NULL을 대입하는 것과 memset을 이용하는 것의 차이

0 은 정수 상수인 동시에 null pointer constant 라는 독특한 역할을 갖고
있습니다. 즉, 0 값을 갖는 정수 상수 수식이나, (void *) 로 변환되는 0
값을 갖는 정수 상수 수식은 포인터가 관련된 문맥에서 null pointer 로 변
환된다고 정의되어 있는 것입니다. 따라서,

if ((p) != 0) { ... }

는 정의에 의해 0 은 p 가 갖는 데이터형의 null pointer 값으로 변환됩니
다. 이때 null pointer 의 내부 표현에 0 이 아닌 값을 사용하는
implementation 은 적절한 내부 표현을 생성할 수 있는 기회를 갖게 됩니다.
하지만,

memset(p, 0, sizeof(p));

의 경우 null pointer constant 가 적절한 null pointer 를 생성할 수 있도
록 정의된 문맥이 아니기 때문에 그냥 p 의 모든 비트를 0 으로 만드는 결
과를 가져오게 됩니다. 이때 null pointer 의 내부 표현에 0 이 아닌 값을
사용하는 implemetnation 에서는 p 가 당연히 null pointer 로 인식되지 않
을 것입니다 - 심각하게 invalid pointer value 로 인식되는 경우 그보다
더 안 좋은 결과를 낳을 수도 있습니다.

즉, 표준은 implementation 에게 null pointer 의 특별한 내부 표현을 강요
하지 않으면서, implementation 이 정상적인 null pointer 를 생성할 수 있
는 기회를 갖도록 null pointer 가 생성되는 문맥을 따로 정의해주고 있는
것입니다. 위에서 if 문은 그와 같은 문맥에 해당하며, memset() 은 그렇지
않은 경우입니다. 따라서, 정상적인 null pointer 생성이 보장되는 문맥을
제대로 사용한다면 null pointer 의 내부 표현에 대한 걱정 없이 null
pointer 얻을 수 있습니다.