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