본문 바로가기

프로그래밍/C언어

[C언어] 지역변수, 전역변수,정적변수

안녕하세요 ! 초보개발자 입니다. 

이 블로그는 개인 공부 정리용 블로그 입니다. 

혹 잘못된 내용이 있다면 지적 부탁드리겠습니다.

그리고 질문주신다면 최대한 아는선에서 답변드리도록 하겠습니다.

그럼 시작하도록 하겠습니다.




1. 지역 변수


{} 블럭내에 선언된 변수를 지역 변수라고 합니다. 함수의 몸통이나 조건문과 반복문의 {} 블럭에 우리는 변수를 선언하여 왔습니다. 그래서 우리는 이때까지 지역변수만을 선언 하였습니다. 아래에 나와 있는 코드를 보면 x, y , result는 모두 지역 변수 입니다. 

 

void add(int x, int y){

int result=0;

result = x + y;

return result;

}

다른 예제를 한번 살펴 보도록 하겠습니다.


void func() {
    int tmp = 100;

    for(int i=0;i<1;i++){

int tmp=200;

printf("tmp=%d\n",tmp);

}

printf("tmp=%d\n",tmp);

}


위의 코드를 보면  for 문안의 tmp 와 func함수의 tmp 와 다르다. 이처럼 지역변수는 블럭내에서만 유효하므로 for 문의 tmp는 for문이 끝남과 동시에 사라집니다. 그렇기 때문에 for문의 tmp와 func함수의 tmp는 이름이 같지만 구별할 수 있습니다.


2. 전역 변수


변수를 함수 밖에 선언하는 것도 가능합니다. 이처럼 함수밖에 선언된 변수를 전역 변수라고 합니다. 전역변수의 범위는 프로그램 처음시작될때 생성되어 프로그램이 끝날 때 까지 유지가 됩니다. 예제를 통하여 알아 보겠습니다.


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
#include<stdio.h>
 
int x;
void func1() {
    int y;
    x = 1;
    y = 2;
    x2 = 10;
    
    printf("func1() x = %d\n", x);
    printf("func1() y = %d\n", y);
    //printf("func1() x2=%d\n", x2); // 변수x2에 대한 정보가 없습니다.
}
 
int x2;
void func2() {
    int z;
    x = 10;
    z = 30;
    x2 = 40;
 
    printf("func2() x=%d\n", x);
    printf("func2() z=%d\n", z);
    printf("func2() x2=%d\n", x2);
}
int main(void) {
    func1();
    func2();
    return 0;
}
 
cs


중간에 x2 변수가 선언 되었습니다. func1에서는 x2에 대한 정보가 없기 때문에 에러가 발생합니다. func1에서 x2를 사용하려면 중간에 있는 int x2를 func1위에 선언해야 할 것입니다.


그렇다면 저번시간에 배운 소스 파일이 여러개로 나누어져 있을 때는 전역 변수를 어떻게 사용 할까 ?


예를 들어 보겠습니다.


<main.c>

int num1=10;

int num2=20;


void func1(void){

num1=1;

num2=2;

}


<sub.c>

void func2(void){

num1=1;

num2=2;

}


위 처럼 소스 파일이 나누어져 있을 경우에는 <sub.c> 에서의 num1, num2을 알 수 없습니다. 그렇다면 <main.c> 에 선언한 전역변수 num1,num2를 사용 하려면 어떻게 해야 할까요 ?


방법은 다음과 같습니다.


<sub.c>

extern int num1;

extern int num2;

void func2(void){

num1=1;

num2=2;

}


위에 소스처럼 extern int num1; extern int num2; 를 해주면 사용할 수 있습니다. 실제 선언이 아니라 참조적 선언입니다. 그렇기 때문에 실제 선언한 것 처럼 저장공간을 확보하지 않습니다. 


3. 정적 변수


정적 변수는 전역 변수앞에 static 를 붙이면 정적 변수가 됩니다. 정적 변수는 전역 변수와 같은 특징을 가지고 있으며 유효범위만 다릅니다. 프로그램 전체가 유효범위인 전역변수와 달리 정적변수는 자신이 선언된 소스파일 내에서만 유효합니다.


오늘 강의는 여기서 마치도록 하겠습니다. 다음강의는 c언어에서 제일 어려운 포인터 입니다.  수고하셨습니다.

'프로그래밍 > C언어' 카테고리의 다른 글

[C언어] 포인터(2) - 포인터의 형변환  (3) 2017.04.23
[C언어] 포인터(1) - 포인터란 ?  (1) 2017.04.20
[C언어] 함수(2)  (1) 2017.04.18
[C언어] 함수(1)  (1) 2017.04.17
[C언어] 연습문제  (0) 2017.04.17