static 자료형 변수이름;
정적 변수는 변수를 선언할 때 앞에 static 키워드를 붙인다.
C언어에서 기본적인 변수는 동적(dynamic) 변수로써 변수 선언과 동시에 메모리에 할당되며 변수 사용이 모두 끝남과 동시에 메모리가 해제된다.
하지만 정적(static) 변수는 전역변수와 동일하게 컴파일시 메모리에 할당되며, 프로그램 종료시 메모리가 해제된다.
따라서 정적 변수는 전역변수처럼 변수의 범위를 벗어나는 경우에도 값을 유지하는 속성을 가지고 있다.
함수 내에서 정적으로 선언한 지역변수는 함수 블록을 벗어나도 값이 사라지지 않아서 정적변수이고, 함수 블록 안에서만 접근할 수 있어서 지역변수다.
그렇다면 전역변수를 정적으로 선언하면?
일반 전역변수와 다르게 파일 외부에서 extern 으로 사용하려고 하면 컴파일(링크) 에러가 발생한다. static 전역 변수는 자신이 선언된 소스 파일 안에서만 사용할 수 있고, 외부에서는 가져다 쓸 수 없기 때문이다. 즉, 전역 변수에 static을 붙이면 변수의 범위를 파일 범위로 제한하는 효과를 낸다.
정적 변수는 함수의 매개변수로 사용할 수 없다. 매개변수에 static을 붙이더라도 매개변수는 정적 변수가 되지 않으며 값이 유지되지 않는다.
void increaseNumber(static int num1) // 정적 변수를 매개변수로 받음
{
printf("%d\n", num1);
num1++;
}
// 잘못된 문법.
// warning C4042: 'num1': 저장소 클래스가 잘못되었습니다.