C 정적(static) 변수




안녕하세요 열코입니다.

이번시간에는 C언어에서의 정적(static) 변수(variable)에 대해 알아보도록 하겠습니다.


C언어에서 기본적인 변수는 동적(dynamic)변수로써 변수 선언과 동시에 메모리에 할당되며

변수 사용이 모두 끝남(변수 선언의 범위가 끝남, 지역변수의 사용종료 시)과 동시에 메모리가 해제됩니다.

하지만 정적 변수는 컴파일시(전역변수와 동일) 메모리에 할당되며, 프로그램 종료시 메모리가 해제됩니다.

따라서 정적 변수는 전역변수처럼 변수의 범위를 벗어나는 경우에도 값을 유지하는 속성을 가지고 있습니다.


다음 예제를 통해 좀 더 이해를 쉽게 돕겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
 
int test(void)
{
    int count = 0;
    count++;
 
    return count;
}
 
int main(void)
{
    printf("%d\n", test());
    printf("%d\n", test());
 
    return 0;
}
cs


위 프로그램의 실행 결과


1

1


test() 라는 함수안에 count라는 int형 지역변수가 존재하며,

이는 main() 함수에서 printf() 함수로 호출할 때, 비로소 메모리에 할당되며 초기화가 됩니다.

첫번째 printf() 함수에서 test() 함수를 호출할 때 count라는 지역변수가 할당되고 0으로 초기화 됩니다.

그리고 count++;문을 통해 count는 1이되며 그 값이 반환되며 1을 출력합니다.




이때, count라는 지역변수는 사라지게되며 메모리 또한 해제됩니다.

두번째 printf() 함수에서 test() 함수를 호출하면 또 다시 count라는 이름의 지역변수가 할당됩니다.

(첫번째 호출된 test() 함수의 count와는 다른 메모리, 이름만 count로 같을 뿐)

따라서 또 다시 1을 출력하게 됩니다.


그렇다면 아래 소스코드의 실행결과는 어떻게 될까요?


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
 
int test(void)
{
    static int count = 0;
    count++;
 
    return count;
}
 
int main(void)
{
    printf("%d\n", test());
    printf("%d\n", test());
 
    return 0;
}
cs


바뀐점이 없다구요??

잘보세요. 5번째 줄의 count 변수 맨 앞에 static이라는 키워드가 붙었습니다.

static 키워드가 붙으면 변수는 정적 변수로 선언되며, 이는 컴파일 시간에 메모리에 할당됩니다.

count라는 변수는 프로그램 종료시까지 메모리가 유지됩니다.


실행 결과는 아래와 같습니다.


1

2


첫번째 printf() 함수에서 test()함수를 호출하면 count라는 이미 선언되어 메모리에 할당되어있는 변수에 1을 더해

1을 반환하며, 두번째 printf() 함수에서 test() 함수를 호출하면 똑같은 변수인 count 함수에 1이 더해져,

결과적으로 2를 반환하게 됩니다.


static int count = 0; 이라고 되어있어서 다시 0으로 초기화되는거 아니냐고 물으시는 분도 계시는데,

위 구문 자체가 컴파일 시간에 메모리에 할당되며 최초 1회 초기화가 실행됩니다.

따라서 두번째 test() 함수 호출 시 0으로 다시 초기화 되지 않고 1에 1을 더한 2를 출력하게됩니다.




정적 변수는 또한 다음과 같은 특징들이 존재합니다.


나중에 따로 언급하겠지만, 메모리 구조상 정적 변수는 일반 지역 변수가 할당되는 스택(stack) 부분이 아닌

데이터(data) 부분에 메모리가 할당됩니다. 이는 추후 메모리 구조 시간에 자세히 설명하겠습니다.


전역 변수와 같이 정적 변수는 명시적으로 초기화하지 않을 때 0으로 자동 초기화 됩니다.

지역 변수는 초기화하지 않으면 쓰레기 값(의미없는 값)으로 초기화 되는것 다 알고계시죠??


C에서는 정적 변수 초기화를 리터럴 상수로만 초기화 가능합니다.

다음과 같은 예제문은 컴파일 오류를 발생시킵니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
int test(void)
{
    return 10;
}
 
int main(void)
{
    static int a = test();
 
    printf("%d\n", a);
 
    return 0;
}
cs


하지만 이는 C++ 프로그램에서는 컴파일 오류를 발생시키지 않습니다.




이상 'C언어 정적 변수'에 대해 알아보았습니다.

질문 또는 오타나 잘못된 정보가 있는 경우 댓글로 달아주세요!

메인 페이지로 이동하시면 더 많은 자료를 볼 수 있습니다.



'C, C++' 카테고리의 다른 글

C언어 변수 이름이 숫자로 시작할 수 없는 이유  (0) 2018.11.13
C 변수 선언 및 키워드  (0) 2018.10.25
C 표준 입력 함수 scanf  (0) 2018.10.23
C 표준 출력 함수 printf()  (0) 2018.10.22
C++ 가상 함수(Virtual Function)  (8) 2018.10.19
C++ 연산자 오버로딩  (2) 2018.10.12
C++ 함수 오버로딩  (0) 2018.10.11
C/C++ 메모리 동적할당  (0) 2018.10.11

to Top