본문 바로가기
프로그래밍 언어/C 언어

[C] static 변수

by 까망 하르방 2021. 3. 19.
반응형

static 변수

- static 변수를 정적 변수라고 부릅니다.

- 전역변수와 지역변수 모두에 static 선언을 추가할 수 있다.

  하지만 static 변수는 접근이 제한된 전역변수를 만드는 것이기에 지역변수에 이용되는게 일반적. 

 

지역변수에 static을 붙인 경우

- 선언된 함수 내에서만 접근이 가능한 것은 계속해서 유효하다.

- But, 해당 함수가 반환되면 소멸되지 않고, 처음 한번 초기화되고

   프로그램 종료 시까지 메모리 공간에 존재한다.

   즉, 한번만 초기화 되는 것입니다. (전역변순의 성격을 조금 띄게 됨)

#include <stdio.h>

int simpleFunc() {
        static int x = 0; // 초기화하지 않으면 0으로 초기화
        int y = 0; // 초기화하지 않으면 쓰레기 값 초기화

        x++; y++;

        printf("static: %d, local: %d \n", x, y);
}
void main() {
        
        int i;
        for (i = 0; i < 3; i++) 
               simpleFunc();
        return;
}

 

Q. static으로 선언된 지역변수 x는 simpleFunc 함수가 호출되어야 선언될까?

A. 아니다!

static 사용의 목적은 전역변수의 선언시 초기화하지 않아도 기본값으로 초기화

프로그램 시작하면 메모리에 할당 및 초기화하는 성질을 띄기에 함수가 호출되기전에 선언됩니다.

함수 내에서만 접근이 가능도록 제한하는 용도로 사용됩니다.

 

다음과 같이 유효하지 않은 범위에서 접근하면 Error 발생

[해석] static 변수는 전역변수의 단점 중 하나인 누구나 함부로 접근할 수 있는 단점 해결

          기존의 전역변수를 static 지역변수로 대체한다면 프로그램의 안전성을 높일 수 있다.

"난 사실 전역변수랑 성격이 같아. 초기화하지 않으면 전역변수처럼 0(기본값)으로 초기화되고,

프로그램 시작과 동시에 할당 및 초기화되어서 프로그램이 종료될 때까지 메모리 공간에 남아있지!

그럼 왜 이 위치에 선언되었냐고? 그건 접근의 범위를 simpleFunc로 제한하기 위해서야"

→ Code 상에서는 SimpleFunc 내부에서 선언되었지만

    메모리상으로는 전역변수와 같이 Data영역에 저장된다.

※ C 언어 메모리 구조 [Code] | [Data] | [Heap] | [Stack]

 

 

반응형

댓글