C 언어 기초

C 언어에서 free(p); 바로 다음에 p = NULL;이라고 쓰는 것이 권장되는 이유로 가장 적절한 것은?

  1. ANULL을 대입하지 않으면 해제한 영역이 다시 사용할 수 있는 상태가 되지 않아, 메모리 누수가 되기 때문에
  2. Bp는 해제한 영역을 가리킨 채 남으므로, 이중 해제나 해제 후 사용을 막고 찾기 쉽게 하기 위해
  3. Cfree는 p를 자동으로 NULL로 만들지만, 만일을 위해 같은 값을 한 번 더 써서 확인하기 위해
정답과 해설 보기

정답: B. p는 해제한 영역을 가리킨 채 남으므로, 이중 해제나 해제 후 사용을 막고 찾기 쉽게 하기 위해

free(p)는 p가 가리키던 영역을 해제하지만, 변수 p의 값(주소)은 그대로 남습니다. 그대로 *p를 읽고 쓰면 해제 후 사용, 다시 free(p)를 호출하면 이중 해제가 되며, 둘 다 미정의 동작으로 힙의 관리 정보를 망가뜨려 떨어진 곳에서 이상이 일어나기도 합니다. p에 NULL을 넣어 두면 free(NULL)은 아무것도 하지 않는다고 정해져 있으므로 이중 해제의 해가 없고, 사용하기 전의 NULL 확인으로 실수도 알아차릴 수 있습니다. 다만 같은 영역을 가리키는 다른 포인터 변수에는 따로 주의가 필요합니다.

이 분야 연습하기 분야로 돌아가기

C 언어 기초의 다른 문제

  1. 위의 함수 save에 8문자의 문자열 "ABCDEFGH"를 전달했다. 일어나는 일로 올바른 것은?
  2. C 언어에서 NULL 포인터를 참조했을(p가 NULL일 때 *p를 읽었을) 때의 설명으로 올바른 것은?
  3. char는 1바이트, int는 4바이트이며, int를 4의 배수 주소에 맞춰 두는 일반적인 환경으로 한다. 위의 코드를 실행했을 때의 출력으로 올바른 것은?
  4. uint32_t는 32비트, uint8_t는 8비트의 부호 없는 정수형이며, 리틀 엔디언 환경으로 한다. 위의 코드를 실행했을 때의 출력으로 올바른 것은?
  5. 3비트의 비트 필드에 9를 넣는 위의 코드를 실행했을 때의 출력으로 올바른 것은?