프로그래밍C 개발자

C 언어의 함수에서 정적 로컬 변수가 어떻게 작동합니까? 일반 로컬 변수와의 차이점은 무엇입니까? 적용 사례와 잠재적 오류를 제시하십시오.

Hintsage AI 어시스턴트로 면접 통과

답변

정적 로컬 변수는 함수 내에서 static 키워드를 사용하여 정의됩니다. 일반 로컬 변수와 달리, 함수 호출 간에 값을 유지하며 단 한 번만 초기화됩니다. 이러한 변수는 프로그램의 전체 생애 동안 존재하지만 자신의 함수 내에서만 가시적입니다.

일반 로컬 변수:

void func() { int count = 0; // 매번 초기화됨 count++; printf("%d\n", count); }

매번 출력은 — 1.

정적 로컬 변수:

void func() { static int count = 0; // 단 한 번만 초기화됨 count++; printf("%d\n", count); }

연속 호출 시 출력: 1, 2, 3, ...

사용: 함수 호출 수를 셀 때와 간단한 값을 캐싱할 때 유용합니다.

함정 질문

"정적 로컬 변수는 함수 종료 후 제거됩니까? 함수의 다음 호출 시 그 값은 어떻게 됩니까?"

자주 제거된다고 답하지만, 그렇지 않습니다.

정답: 정적 로컬 변수는 프로그램의 전체 생애 동안 존재합니다. 함수 호출 간에 값을 유지하며 단 한 번만 초기화됩니다 (함수에 처음 들어갈 때 또는 main 전에).

주제에 대한 미세한 지식 부족으로 인한 실제 오류 사례


이야기 1

프로젝트에서 모듈에 들어가는 시간 지표를 측정하기 위해 매번 들어가면 세는 함수가 필요했습니다. int counter = 0;static int counter = 0;을 혼동하여 함수는 항상 1을 반환했고 통계는 쓸모없게 되었습니다.


이야기 2

하나의 스레드 안전하지 않은 서비스에서 여러 스레드가 호출하는 함수 내에서 정적 변수를 사용했습니다. 이는 경쟁 상태와 임의의 잘못된 결과를 초래했습니다. 공유 메모리가 보호되지 않는다는 것을 간과했습니다.


이야기 3

캐싱을 위해 정적 변수에 동적으로 할당된 메모리의 포인터를 저장했습니다. 함수 재시작 시 이전 메모리를 해제하지 않아 매 호출 시 메모리 누수가 발생했습니다.