본문 바로가기

C언어/강의

2010년 12월 13일 월요일 (저장 클래스)

static의 특징
main.c
#include <stdio.h>

void test(void);

int iNumC;

int main()
{
  static int iNumA=5;

  printf("main Address iNumA : %d\n", iNumA);
  printf("main Value iNumA : %08X\n"&iNumA);
  printf("main Address iNumC : %d\n", iNumC);
  printf("main Value iNumC : %08X\n"&iNumC);
  ++iNumC;
  test();
  //test();
  //test();
  printf("main Address iNumC : %d\n", iNumC);
  printf("main Value iNumC : %08X\n"&iNumC);
  return 0;
}
test.c
int iNumC;

void test(void)
{
  static int iNumA;
  int iNumB;
  
  printf("============ TEST() START =============\n");
  printf("func's TESTA(%d)\n", iNumA);
  printf("test Address iNumA : %08X (static)\n"&iNumA);  // static 변수 
  printf("test Address iNumB : %08X (지역)\n"&iNumB);  // 지역 변수 
  printf("test Address iNumC : %08X (전역)\n"&iNumC);  // 전역 변수 
  printf("=======================================\n");
  printf("test Value iNumA : %d (static)\n", iNumA);  // static 변수 
  printf("test Value iNumB : %d (지역)\n", iNumB);  // 지역 변수 
  iNumC=5;
  printf("test Value iNumC : %d (전역)\n", iNumC);  // 전역 변수 
  printf("=======================================\n");
  iNumA++;
  iNumB++;
  return;
}


위의 소스를 보면 우선 실험을 위해 main함수와 test함수를 분리해 놨다. 우선 A변수는 main과 test함수에서 static을 선언하였고 C변수는 전역변수로 선언해 놓았다. 그리고 B변수는 지역변수이다. 지역변수는 이미 알고있듯이 함수 내에서 선언할경우 지역변수가 되는데 지역변수는 알고있으므로 패스한다. 다음 전역변수부터 보도록 한다. 전역변수 C의 주소를 보면 main함수의 주소와 비슷한것을 볼수있다. 전역변수의 경우는 지역변수와 같이 스택에 저장되는 것이 아니라 BSS, DATA영역을 할당받는데 초기화를 하지 않을경우는 BSS영역에서 타입형만큼의 크기를 0으로 가득채워놓고 정보를 기억하고 있다가 초기화가 이루어지면 DATA영역에 할당되어 그 값을 기억한다. 위에 소스를 보면 main.c와 test.c에 각각 전역변수로 C를 선언되어있다. main.c에서 전역변수를 선언안하고 컴파일할경우 에러메시지와 함께 컴파일이 되지는 않지만 main.c에서도 전역변수를 선언해주면 이상없이 컴파일이 된다. 그리고 출력결과를 확인해보면 main의 전역변수 주소와 test의 전역변수 주소가 같은것을 볼수있다. 그리고 main에서 C변수를 수정하니 test의 변수도 같이 변한것을 볼수있고 test에서 5를 대입해주니 main에서도 5가 대입된것을 볼수있다. 이것을 보면 전역변수C는 모든 함수의 공유를 한다는 것을 유추할수 있는데 이것이 전역변수의 장점이자 단점이 된다. C프로그램에서 유일하게 접근성을 갖고있다. 그리고 static변수를 다시 확인해보자.
위에 출력결과를 보면 static변수A의 주소는 main과 test에서 각각 다른것을 확인할수 있다. 지역변수의 경우 함수를 빠져나가면 그값이 사라지는데 반해 static변수의 경우 함수를 호출하고 빠져나가도 그 값이 전역변수처럼 사라지지않는다. 그리고 전역변수처럼 다른함수의 접근을 허용하지 않아 보안기능을 갖고있다. 위에 소스에서는 main함수에서 A변수의 값을 5넣었다. 출력결과를보면 main은 5인데 test함수의 A변수는 0인것을 보면 쉽게 이해할수 있을 것이다.