C 언어 기초

C 언어에서 NULL 포인터를 참조했을(p가 NULL일 때 *p를 읽었을) 때의 설명으로 올바른 것은?

  1. A규격상 실행 시 오류로 반드시 검출되게 되어 있어, 어느 환경에서나 오류 메시지를 내고 프로그램이 멈춘다
  2. BNULL은 0번지를 가리킨다고 정해져 있으므로, 어느 환경에서나 0번지의 내용이 읽히고 그대로 처리가 계속된다
  3. C미정의 동작이며, OS 위에서는 일반적으로 비정상 종료하지만, MMU가 없는 마이컴에서는 0번지를 읽을 수 있어 알아차리지 못하기도 한다
정답과 해설 보기

정답: C. 미정의 동작이며, OS 위에서는 일반적으로 비정상 종료하지만, MMU가 없는 마이컴에서는 0번지를 읽을 수 있어 알아차리지 못하기도 한다

NULL 포인터의 참조는 미정의 동작으로, 무슨 일이 일어날지는 규격에서 정해져 있지 않습니다. Linux나 Windows에서는 0번지 부근에 페이지를 할당하지 않으므로, 참조하면 페이지 폴트가 일어나 일반적으로 프로그램은 비정상 종료합니다(Linux의 세그멘테이션 위반 등). MMU를 갖지 않는 작은 마이컴에서는 0번지에 플래시 메모리나 인터럽트 벡터 표가 있어 읽혀 버리는 경우가 있으며, 실수가 드러나지 않은 채 오동작하기도 합니다. 포인터를 사용하기 전에 NULL이 아님을 확인하는 것이 중요합니다.

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

C 언어 기초의 다른 문제

  1. char는 1바이트, int는 4바이트이며, int를 4의 배수 주소에 맞춰 두는 일반적인 환경으로 한다. 위의 코드를 실행했을 때의 출력으로 올바른 것은?
  2. uint32_t는 32비트, uint8_t는 8비트의 부호 없는 정수형이며, 리틀 엔디언 환경으로 한다. 위의 코드를 실행했을 때의 출력으로 올바른 것은?
  3. 3비트의 비트 필드에 9를 넣는 위의 코드를 실행했을 때의 출력으로 올바른 것은?
  4. #define으로 정의한 매크로 SQUARE를 사용하는 위의 코드를 실행했을 때의 출력으로 올바른 것은?
  5. 헤더 파일 sensor.h를 위와 같이 작성했다. #ifndef, #define, #endif의 세 줄의 목적으로 올바른 것은?