C 언어 기초
int *make(void) {
int x = 42;
return &x;
}위의 함수 make가 반환하는 포인터에 대해 올바른 것은?
- Ax는 프로그램 종료까지 같은 곳에 남으므로, 반환한 포인터를 통해 언제든지 42를 안전하게 읽을 수 있다
- Bx는 돌아갈 때 힙으로 옮겨지므로, 다 쓰면 호출한 쪽에서 free해야 한다
- Cx의 수명은 함수에서 돌아가면 끝나므로, 반환한 포인터는 무효한 곳을 가리키며 사용하면 미정의 동작이 된다
정답과 해설 보기
정답: C. x의 수명은 함수에서 돌아가면 끝나므로, 반환한 포인터는 무효한 곳을 가리키며 사용하면 미정의 동작이 된다
x는 static이 붙지 않은 지역 변수(자동 변수)로, 함수에서 돌아가면 그 수명이 끝나고, 놓여 있던 스택의 자리는 다른 함수의 호출에서 다시 사용됩니다. 수명이 끝난 영역을 가리키는 포인터를 댕글링 포인터라고 하며, 이를 통해 읽고 쓰면 미정의 동작이 됩니다. gcc에서는 이 작성 방식에 경고가 나오며, NULL을 반환하는 코드가 만들어지기도 합니다. 값 자체를 반환하거나, 호출한 쪽이 준비한 영역이나 malloc으로 확보한 영역을 사용합니다.