컴퓨터의 RAM은 1바이트마다 0, 1, 2, 3처럼 1씩 증가하는 일련번호(메모리 주소)가 붙어 있는 물리적 반도체 공간입니다.
int *ptr = (int *)malloc(sizeof(int)); // 1단계: 힙 메모리 4바이트 할당
*ptr = 42; // 2단계: 주소에 숫자 42 저장
free(ptr); // 3단계: 힙 메모리 사용 권한 반납
malloc(4): 운영체제가 힙 영역에서 비어 있는 연속된 4바이트 공간(예: 주소 0x5000번지)의 사용 권한을 부여하고, 그 시작 주소 번호인 숫자 0x5000을 반환합니다.*ptr = 42: 포인터 변수 ptr에 저장된 주소 0x5000번지로 이동하여 4바이트 공간에 숫자 42를 2진수로 기록합니다.free(ptr): 운영체제에 "주소 0x5000번지의 4바이트 공간을 이제 다른 변수나 코드가 써도 된다"고 알립니다.free(ptr);을 실행하면 0x5000번지의 힙 메모리 사용 권한만 반납됩니다.ptr 안에 들어있던 숫자 0x5000은 컴퓨터가 0으로 자동으로 지워주지 않으므로 그대로 남아 있습니다.free(ptr); // 0x5000 주소를 반납함
*ptr = 100; // 반납된 0x5000 주소에 숫자 100을 덮어씀 (심각한 오류)
0x5000은 나중에 호출된 다른 malloc에 의해 전혀 다른 데이터나 함수 주소가 배치될 수 있습니다.ptr을 통해 숫자를 덮어쓰면, 새로 할당된 다른 변수의 데이터가 깨지거나 프로그램이 비정상 종료(Segmentation Fault)됩니다.free(ptr);
ptr = NULL; // ptr 내부의 숫자를 0x0(접근 불가 주소)으로 변경
NULL(주소 0)로 바꿔두면, 이후 실수로 *ptr을 실행하더라도 운영체제가 즉시 에러를 발생시키며 프로그램을 안전하게 멈추어 주므로 다른 메모리가 오염되는 것을 차단합니다.