C언어 함수로 보는 지역변수와 전역변수 차이점

C언어 지역 변수는 함수, 코드 블록에서 선언됩니다. 지역 변수는 함수, 코드 블록에서만 생존하며 함수를 빠져나오면 소멸합니다. 전역 변수는 함수 밖에서 선언됩니다. 전역 변수는 C언어 전체 파일에서 사용될 수 있습니다.

C언어 지역변수와 전역변수

지역 변수는 해당 함수나 코드 블록 내부에서 선언됩니다. 사용 범위는 해당 코드 블록 또는 자식 요소에 상속되지만 함수나 코드 블록 밖을 나가면 소멸합니다. 반면 전역 변수는 함수 밖에서 선언되며, C언어 파일 전체에서 사용될 수 있습니다.

C-function-local-variable-3

C언어 지역변수

지역변수란 함수나, 반복문, 조건문 등을 지정할 때 발생하는 중괄호 { } 로 지정된 코드 블록 사이에서만 수명이 존재하는 변수를 말합니다.

지금까지 사용했던 대부분의 변수는 지역변수로 main() { }이라는 함수 범위에서만 존재합니다. 예를 들어 main () 함수 내부에서 지정한 변수는 사용자 정의 함수에서 사용될 수 없습니다.

#include <stdio.h>
//사용자 정의 함수 원형 선언
int PrintNumber();

//main 함수
int main()
{
	int a = 7; //변수 a는 main () 함수의 지역변수

	PrintNumber(); //호출되지 않습니다.
        return 0;
}

//사용자 정의 함수
int PrintNumber()
{
	printf("행운의 숫자는 %d 입니다. \n", a); //main () 의 변수 a는 사용자 정의 함수로 올 수 없습니다.

	return 0;
}

결과

E0020 식별자 "a"이(가) 정의되어 있지 않습니다.
C2065 'a': 선언되지 않은 식별자입니다.

반대로 사용자 정의 함수에서 지정된 변수는 지역 변수 처리되어, main () 함수에서 호출할 수 없습니다.

#include <stdio.h>
//사용자 정의 함수 원형 선언
int PrintNumber();

//main 함수
int main()
{
	PrintNumber(); //함수 호출

	printf("%d", a); //변수 a는 PrintNumber() 함수의 지역변수이므로 오류입니다.

	return 0;
}

//사용자 정의 함수
int PrintNumber()
{
	int a = 7; //변수 a는 PrintNumber() 의 지역 변수
	printf("행운의 숫자는 %d 입니다. \n", a);

	return 0;
}

결과

E0020 식별자 "a"이(가) 정의되어 있지 않습니다.
C2065 'a': 선언되지 않은 식별자입니다.

따라서 main () 함수 영역과 사용자 정의 함수 영역의 변수명이 서로 같아도 잘 작동합니다.

#include <stdio.h>
//사용자 정의 함수 원형 선언
int PrintNumber();

//main 함수
int main()
{
	int a = 4; //변수 a는 main()의 지역변수
	PrintNumber(); //함수 호출

	printf("공포의 숫자는 %d 입니다. \n", a); //a = 4를 인쇄

	return 0;
}

//사용자 정의 함수
int PrintNumber()
{
	int a = 7; //변수 a는 PrintNumber()의 지역변수
	printf("행운의 숫자는 %d 입니다. \n", a); //a = 7을 인쇄

	return 0;
}

결과

행운의 숫자는 7 입니다.
공포의 숫자는 4 입니다.

main () 전체에 지정한 변수는 내부에 생성된 반복문, 조건문의 { } 코드 블록 내부까지 상속되됩니다. 일반적으로 자주 보는 반복문의 모습입니다.

#include <stdio.h>
void main()
{
	int i; //main ()에서 선언한 변수는 내부 코드 블록까지 상속

	for (i = 0; i <= 3; i++)
	{
		printf("%d \n", i);
	}
}

결과

0
1
2
3

하지만 반복문, 조건문 등의 작은 범위에서 생성한 변수는 부모 범위인 main () 함수 영역으로 전달되지 않으므로 지역변수가 됩니다.

#include <stdio.h>
void main()
{
	int i; //main ()에서 선언한 변수는 내부 코드 블록까지 상속

	for (i = 0; i <= 3; i++)
	{
		int a = 9; //for { } 사이의 변수 a는 for문의 지역변수

		printf("%d \n", i);
		printf("%d \n", a);
	}

	printf("%d", a); //for { } 내부의 a는 지역변수로 호출 불가
}

결과

E0020 식별자 "a"이(가) 정의되어 있지 않습니다.
C2065 'a': 선언되지 않은 식별자입니다.

C언어 전역변수

C언어 전역변수는 함수 외부에서 생성되어 C언어 전체 파일에서 사용될 수 있는 변수입니다. 전역변수는 main ()이나 사용자 정의 함수 코드 블록 밖에서 선언되야합니다.

자료형 변수명;

main ()
{
  ... .. ...
  .. ... ..
}

함수 밖에 전역변수를 선언해놓으면, main () 이나 사용자 정의 함수 등의 영역에서 자유롭게 사용할 수 있습니다.

#include <stdio.h>
//함수 원형 선언
void Seven();
void Four();

//전역 변수 선언
int i, j;

//main 함수
int main()
{
	i = 7;
	j = 4;

	Seven();
	Four();

	return 0;
}

//Seven 사용자 정의 함수
void Seven()
{
	printf("행운의 숫자는 %d 입니다. \n", i);
}

//Four 사용자 정의 함수
void Four()
{
	printf("행운의 숫자는 %d 입니다. \n", j);
}

결과

행운의 숫자는 7 입니다.
행운의 숫자는 4 입니다.

전역 변수가 main() 함수 및 사용자 정의 함수 등에서 자유롭게 호출되는 모습입니다.