iOS/정보처리기사

[정보처리기사] C언어 - STATIC변수

Chafle 2022. 6. 23. 22:27
반응형
STATIC변수란

 

단 한번만 초기화 되고, 그 이후에는 전역변수처럼 프로그램이 종료될 때까지 메모리 공간에 존재하는 변수.

초기값이 지정이 안되면, 자동으로 0이 대입된다.

 

 

int a; 로 선언하면 a에 임의로 이상한 값이 들어가있는데,
static int a로 선언하면, 0이 자동으로 대입된다.

 

 

 

지역변수와 STATIC변수의 활용을 비교해보자

 

지역변수의 사용

 

 

void tes() {

int a = 10;

a++;

printf("%d" a);

}

void main() {

test();

test();

}

 

a
10
11

 

한번 사용한 지역변수는 초기화 돼서

두 번째 test를 호출할 때에 a에 역시 10이 들어있어서

 

결과값으로 

11, 11이 출력되게 된다.

 

 

static 변수 사용

 

void test() { 

static int a = 10;

a++;

printf("%d", a);

}

void main() {

test();

test();

}

a
10
11

 

정적변수이기 때문에 함수가 종료 돼도 a는 그대로 남아있다.

그러고 test함수를 더 호출하게 되면, a가 이미 만들어져있고, 초기값은 한번만 수행하게 되므로

static int a로 값이 10으로 초기화 되는 것이 아니고 11인 상태에서 a++가 돼서 11-> 12로 a값이 연산되게 된다.

그러므로 11, 12가 출력된다.

 

 

결론: 정적변수는 메모리에 한번 올라가면, 초기값을 안주고 메모리 그대로 올라간다.

 

 


 

 

ex1

 

#include<stdio.h>

void funcCount();

int main(void) {

int num;

for(num = 0; num <2; num ++)

funcCount();

return 0;

}

 

void funcCount() {

int num = 0;

static int count;

printf("num = %d, count %d₩n", ++num, count++);

}

 

 

 

 

 

해설

 

 

**참고

void funcCount();

int main(void) {

 

main함수 밑에 funcCount라는 함수가 있다고 지시해주는 것

 

 

 

for(num = 0; num <2; num++)

funcCount();

  num
초기값 0

 

 

int num = 0;

static int count; -> STATIC변수로 선언하면, 0이 기본값으로 설정

printf("num = %d, count = %d₩n", ++num, count++);

 

  ++num num STATIC count count++
초기값   0 0  
funcCount num = 0 1 1 0 1
지역변수는 초기화 정적변수는 그대로   0 1  
funcCount num = 1 1 1 1 2
지역변수는 초기화 정적변수는 그대로   0 2  

 

  num
초기값 0
0<2 -> 참 funcCount()수행 num = 1, count = 0
1<2 ->참 funcCount()수행 num = 1, count = 1
2<2->거짓 for문을 빠져나온다. -

 

num = 1, count = 0

num = 1, count = 1

 

 

 


 

ex2

 

 

 #include<stdio.h>

void main() {

int i = 0, sum = 0;

while(i <3) {

sum = sum +fo();

i++;

}

printf("sum = %d₩n", sum);

}

 

int fo(void){

int var1 = 1;

static int var2 = 1;

return(var1++) + (var2++);

}

 

 

 

해설

 

  i sum (sum +fo())
초기값 0 0

 

while(i <3) {

sum = sum +fo();

i++;

 

  i sum (sum +fo())
초기값 0 0
0<3 -> 참  0 0+2 = 2
1<3 -> 참 1 2+3 = 5
2<3->참 2 5+4 = 9
3<3 -> 거짓 while문 나온다.   9

 

 

int var1 = 1;

static int var2 = 1;

return(var1++) + (var2++);

 

 

fo

  var1 STATIC var2 (var1++) + (var2++)
초기값 1 1  
  1 1 1+1 = 2
var1++,var2++ 2 2  
지역변수 초기화 ->1(int var1 = 1) 2  
  1 2 1+2  = 3
var1++,var2++ 2 3  
지역변수 초기화 ->1(int var1 = 1) 3  
  1 3 1+3 = 4
var1++,var2++ 2 4  
지역변수 초기화 - 4  

 

 

답 sum = 9

 

 

 


 

 

ex3

 

#include<stdio.h>

void main() {

int s1, s2;

s1 = funcA(2);

printf("F1 = %d", s1);

s1 = funcA(3);

printf("F2 = %d", s1);

s2 = funcB(2);

printf("F3 = %d", s2);

s2 = funcB(3);

printf("F4 = %d", s2);

}

 

int funcA(int n) {

static int s = 1;

s *= n;

return s;

}

int funcB(int n) {

int s= 1;

s *= n;

return s;

}

 

 

 

해설

 

main

  s1 s2
초기값    

s1 = funcA(2); -> 2를 들고 funcA호출

printf("F1 = %d", s1);

s1 = funcA(3); -> 3를 들고 funcA호출

printf("F2 = %d", s1);

s2 = funcB(2);-> 2를 들고 funcB호출

printf("F3 = %d", s2);

s2 = funcB(3);-> 3를 들고 funcB호출

 

funcA

  n STATIC s s = s*n  
초기값   1    
int n = 2 2 1 2*1 = 2 F1
지역변수 초기화   2    
int n = 3 3 2 3*2 = 6 F2
지역변수 초기화   6    
함수 종료 후 STATIC 초기화   -    

funcB

  n s s = s*n  
초기값   1    
int n = 2 2 1 2*1 = 2 F3
지역변수 초기화 - -    
int n = 3 3 1 3*1 = 3 F4
지역변수 초기화 - -    

 

답:

F1 = 2

F2 = 6

F3 = 2

F4 = 3

 

 


 

 

ex4

 

#include<stdio.h>

int a = 10;

int b = 20;

int c = 30;

 

void main() {

func();

func();

printf("a=%d, b=%d, c=%d₩n", a, b c);

}

 

void func(void) {

static int a = 100;

int b = 200;

a++;

b++;

c = a;

}

 

 

 

해설

 

전역변수

  a b c
초기값 10 20 30

 

 

a++;

b++;

 

 

func

  STATIC a b
func 초기값 100 200
func 101 201
지역변수 초기화 101 -
func 초기값 101 200
func 102 201
지역변수 초기화 102 -
함수 종료 후 모두 초기화 - -

 

c = a;

c는 함수 내에서 선언되지 않았기 떄문에 전역 변수 c에 a를 할당하면 된다.

 

전역변수

  a b c
초기값 10 20 30
func()     101
func()     102
최종 10 20 102

printf("a=%d, b=%d, c=%d₩n", a, b c);

a = 10, b = 20, c = 102

 

반응형