static 지역변수는 스택이 아닌 데이터 영역에 저장된다. 전역변수와 동일한 위치(데이터 영역), 동일한 시점(프로그램의 시작과 동시에)에 메모리로 올라간다. 메모리로 올라가면 프로그램이 종료될 때까지 공간을 차지한다. 아래 코드를 통해 이를 실험해볼 수 있다.
// static 지역변수
#include <stdio.h>
void CountFctCall(void);
int main(void)
{
CountFctCall();
CountFctCall();
CountFctCall();
return 0;
}
void CountFctCall(void)
{
static int cnt = 1;
printf("This Function called %d. \n", cnt);
cnt++;
}
// 일반 지역변수
void FunctionCall(void);
int main(void)
{
FunctionCall();
FunctionCall();
FunctionCall();
return 0;
}
void FunctionCall(void)
{
int cnt = 1;
printf("This Func called %d. \n", cnt);
cnt++;
}
그렇다면 왜 전역변수를 놔두고 굳이 static 변수를 사용할까?
예를 들어, 전역변수처럼 계속해서 유지해야 하는 변수가 있는데 이 변수가 하나의 함수에서만 접근을 한다면 static 변수를 사용함으로써 전역변수의 특징은 그대로 남겨두면서, 언제 어디서나 접근이 가능하다는 단점은 제거할 수 있다. 결국, 상황에 맞게 활용하면 된다.
아래 그림을 보면 C 코드가 각각 메모리 영역의 어디에 할당되는지 알 수 있다.