C 언어 기초

int *make(void) {
    int x = 42;
    return &x;
}

위의 함수 make가 반환하는 포인터에 대해 올바른 것은?

  1. Ax는 프로그램 종료까지 같은 곳에 남으므로, 반환한 포인터를 통해 언제든지 42를 안전하게 읽을 수 있다
  2. Bx는 돌아갈 때 힙으로 옮겨지므로, 다 쓰면 호출한 쪽에서 free해야 한다
  3. Cx의 수명은 함수에서 돌아가면 끝나므로, 반환한 포인터는 무효한 곳을 가리키며 사용하면 미정의 동작이 된다
정답과 해설 보기

정답: C. x의 수명은 함수에서 돌아가면 끝나므로, 반환한 포인터는 무효한 곳을 가리키며 사용하면 미정의 동작이 된다

x는 static이 붙지 않은 지역 변수(자동 변수)로, 함수에서 돌아가면 그 수명이 끝나고, 놓여 있던 스택의 자리는 다른 함수의 호출에서 다시 사용됩니다. 수명이 끝난 영역을 가리키는 포인터를 댕글링 포인터라고 하며, 이를 통해 읽고 쓰면 미정의 동작이 됩니다. gcc에서는 이 작성 방식에 경고가 나오며, NULL을 반환하는 코드가 만들어지기도 합니다. 값 자체를 반환하거나, 호출한 쪽이 준비한 영역이나 malloc으로 확보한 영역을 사용합니다.

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

C 언어 기초의 다른 문제

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