iOS/정보처리기사

[정보처리기사] C언어 - 변수의 종류와 유효범위(지역변수, 전역변수, 정적변수, 동적변수)

Chafle 2022. 5. 20. 18:22
반응형
변수의 종류(쉽게쉽게)

 

 

지역변수: 지역안에서만 사용

전역변수: 공동으로 쓰는 것

정적변수: 공동으로 쓰는 것

동적변수: 그때 그때 만들어서 사용

 


 

지역변수란?

 

  • 함수/블록 안에서 선언하는 변수
  • 함수/블록의 종료와 함께 메모리상에서 소멸
  • 초기값이 없으면 쓰레기 값이 들어감
  • 스택 영역에 저장됨

 

 

ex.

void main(){

if ( 1 ) { // 1은 참이니까 블록 안으로 들어감

int num1 = 10; // num1이라는 공간에 10의 값을 할당

printf("%d, num1); // 10 출력됨

} // 블록 끝남

printf("%d", num1); // 블록 끝났으니까 메모리상에서 소멸됨

}

 


 

 

전역변수란?

 

 

  • 함수 블록 밖에서 선언하며, 전체 함수에 영향을 미친다.
  • 프로그램이 종료될 때 메모리상에서 소멸
  • 초기값이 없으면 0값이 들어감
  • 데이터 영역에 저장됨

 

ex.

int num1; // {}안에 없으므로 전역변수

void main(){

num1 = 10; // 메모리상에 num1에 10 할당

printf("%d", num1); //10출력

func(); // 하단 func로 제어권을 넘겨준다

printf("%d", num1); // func에서 20할당 했으니까, num1에 20할당한 20출력

}

void func(){

num1 = 20; // num1에 20 할당 후 제어권 다시 상단으로 돌아가

}

 

 


 

반응형

 

정적변수란?

 

 

  • 전역변수와 거의 비슷하다
  • static으로 선언하며, 선언된 블록 내에서만 사용 가능
  • 함수가 종료되어도 소멸되지 않고, 값이 그대로 유지됨
  • 프로그램이 종료될 때 메모리에서 소멸
  • 초기값이 없으면 0이 입력되고, 단 한번만 초기화
  • 데이터 영역에 저장됨
  • static으로 사용

 

ex. (코드 진행 순 상단->하단, 검->파->빨)

void main(){

add(10); // 10을 가지고 add함수를 호출

add(5); // 5를 가지고 add함수 호출

add(3); // 3을 가지고 add함수 호출

}

int add(int i) { // i =10 // i=5 // i=3

static int sum = 0; // sum이라는 공간에 0 할당 // sum이 메모리상에 이미 10으로 할당 돼있으므로 무시한다 // sum에 15가 할당돼있으므로 무시한다

sum = sum + i; // 0+10 = 10 sum에 10 할당 // 10+5로 sum에 15로 할당 // 15+3으로 sum에 18로 할당

printf("sum:%d₩n", sum); // sum공간에 10이 있으므로 10 할당 // 여기서 원래라면 함수가 끝나면서 사라져야 되는데 static변수이므로 로 사라지지 않고 그대로 다시 올라가게 됨  // sum에 15값 출력 // 다시 올라가 // sum에 18값 출력

}

 

위 함수를 결과로 출력하게 되면

sum: 10

sum: 15

sum: 18

 

 

다시 올라가는 것이 재귀함수처럼 보이는데..?

 

 

다시 올라가는 것을 보면 재귀함수의 기능을 가지고 있는 것처럼 보이나,

재귀는 아니고 코드를 하단으로 실행하다 보니 호출할 때마다 저장돼있는 값이 달라져서 재귀처럼 보이는 것일 뿐

 

 


 

동적변수란?

 

 

  • 메모리 동적할당으로 생성되는 변수
  • run time시간에 메모를 할당
  • 동적 기억장소에 할당하여 메모리 낭비를 피하려는 목적
  • 무조건 포인터를 사용해야 함
  • 힙 영역에 저장됨
반응형