본문 바로가기

BackEnd/C

변수의 종류에 따른 특성과 할당 위치

반응형

1. 스택영역에 할당되는 지역변수와 매개변수


지역변수,매개변수는 임시적인 특성을 가진다. 


프로그램 실행 중간에 생성되었다가, 어느 순간에 사라진다.


아래는 메인함수내에서 지역변수 n이 선언되자, 스택 영역에 변수n이 할당되었다.




아래에서도 fct함수가 호출되자 매개변수 n과 지역변수 num이 스택에 할당되었다. 



그리고 다시 fct함수 중괄호 지역을 벗어나면 변수는 메모리 공간에서 소멸된다.



앞서 스택은 잠깐 사용하고 삭제할 데이터들을 저장하기 위해 마련해 둔 공간이라고 하였는데, 


이는 지역변수와 매개변수를 두고 한말이다. 이렇게 생성 및 소멸과 관련해서 동일한 특성(임시변


)을 지니는 지역변수와 매개변수를 스택이라는 하나의 메모리 공간에 쌓아두면, 관리가 용이해지


고 성능의 향상으로 이어진다. 왜냐하면 변수 n과 num을 소멸시키는 과정에서 둘 다 스택에서 


아 지우게된다. 이것이 메모리 공간을 나눠서 관리하는 이유이다.



2. 데이터 영역에 할당되는 전역변수


1) 전역변수란?


전역변수는 프로그램 전체영역에서 접근가능한 변수이다. 즉, 지역변수와 달리 중괄호로 표현되


는 특정 영역에 속하지 않는 변수를 가리켜 전역변수라 한다. 


2) 예시 코드


아래 10행, 19행, 25행에서 처럼 전역변수는 프로그램 전체영역에서 접근이 가능하다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
 
int fct1(void);
int fct2(void);
 
int val;  // 전역변수 val
 
int main(void)
{
    printf("%d \n", val);// 전역변수 val
    fct1();
    fct2();
    return 0;
}
 
int fct1(void)
{
    val++;
    printf("%d \n", val);// 전역변수 val
}
 
int fct2(void)
{
    val++;
    printf("%d \n", val);// 전역변수 val
}
cs



3) 데이터 영역에 할당되는 전역변수


전역변수는 프로그램의 시작과 동시에 메모리 공간에 할당이 되어, 프로그램이 종료될


때까지 메모리 공간에 남아있다. 즉 프로그램이 종료 될 때까지 쭉 남겨둘 데이터를 위해 마련


된 공간인 데이터 영역에 저장해야 한다. 



4) 전역변수의 초기화 시점


전역변수는 프로그램 시작시점(메인 함수가 호출되기 이전)에 메모리 공간에 할당된다고 하였


는데 정확한 시점이 언제일까? 그 시점은 코드영역으로 정의된 함수들이 올라가는 시점에 전역


변수들도 데이터 영역에 동시에 올라간다.



위 처럼 코드영역에 올라가는 시점과 데이터영역에 올라가는 시점이 같기 때문에 전역변수 n1


에는 변수가 아닌 상수로만 초기화 할 수 있다. 함수의 반환값으로 초기화 할수 없다. 


즉 메모리에 올라가는 시점이 같기 때문에 아직 올라가지도 않은 함수를 반환 할수 없는 것


이다. 함수의 호출은 컴파일된 바너리 코드가 코드 영역에 올라가야 함수의 호출이 가능하다.




5) 전역변수의 특성



- 전역변수를 초기화 하지 않고 선언만 하면 0으로 초기화 된다. 반면 지역변수는 초기화하지 


않으면 쓰레기 값으로 초기화된다.


둘이상의 함수에서 공동으로 접근해야할 메모리 공간이 필요하다면 전역변수는 유용하다.


하지만 전역변수로 선언이 되는 순간부터 다른 함수로부터의 잘못된 접근 위험에 노출되는것이


다. 즉, 잘못된 접근의 가능성이 지역변수보다 높고, 전역변수의 변경은 프로그램 전체의 변경으


로 이어수 있다.


- 지역변수가 전역변수를 가릴 수도 있다. 아래 코드를 봐보자 위에서 보았던 코드에 fct3함수


가 가 되었다. 그런데 34행에서는 전역변수가 아닌 지역 변수가 출력된다. 즉 함수 안에 선언


된 val 지역변수는 전역변수로의 접근을 가리게 된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
 
int fct1(void);
int fct2(void);
int fct3(void);
 
int val;  // 전역변수 val
 
int main(void)
{
    printf("%d \n", val);// 전역변수 val
    fct1();
    fct2();
    fct3();
    return 0;
}
 
int fct1(void)
{
    val++;
    printf("%d \n", val);// 전역변수 val
}
 
int fct2(void)
{
    val++;
    printf("%d \n", val);// 전역변수 val
}
 
int fct3(void)
{
    int val=0;   // 전역변수를 가리는 지역변수
    val++;
    printf("%d \n", val);// 지역변수 val
}
cs


3. static 지역변수


1) static 지역변수란?


함수안에서 지역변수를 선언하고 키워드 static을 붙인것이다. 


전연벽수와 동일한 특성을 가지고 있지만 선언된 함수 내에서만


접근을 허용하기 위한 변수이다. 일단 아래를 봐보자



2) static 지역변수의 할당시점 및 위치


전역 변수와 할당시점이 동일하고 위치도 동일하다. 지역 변수는 함수를 벗어나면 사라져야 한


다. 하지만 static 지역 변수는 비록 함수 안에 있지만 사라지지 않는다. 


함수가 호출되기 이전에 이미 스택이 아닌 데이터 영역에 올라가 버린다.



그리고 CountFctCall 함수가 코드 영역으로 올라갈 때, static 변수의 선언문이 함께 올라가지 않


는다. 이는 static 변수의 선언이 함수가 호출될 때마다 실행되는 것이 아님을 의미한다.


3) static 변수의 활용


그렇다면 전역변수와 동일한 특성을 보이는 static 변수는 언제 쓰일까?


바로 static 변수의 접근 범위를 CountFctCall 함수 내로 제한할때 쓰인다.


즉 전역변수처럼 전체영역에서 접근이 불가하고, 선언된 함수 내에서만 접근이 가능하다.



이렇게 전역변수의 특성을 가지고 있으면서도 다른 함수로부터 잘못된 접근 위험에 노출되


지 않고, 하나의 함수에서만 접근을 허용하고 싶다면 static변수의 활용 가치가 있을것이다.

반응형

'BackEnd > C' 카테고리의 다른 글

.  (0) 2019.03.08
.  (0) 2019.03.08
메모리 구조  (0) 2019.03.05
  (0) 2019.03.05
문자의 표현방법과 문자 관련 표준함수들  (0) 2019.03.04