본문 바로가기

프로그래밍 언어 개념/C

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

지역변수

 

1. 지역변수의 특징

1) 선언된 지역 내에서만 유효하다.

2) 중괄호 내에 선언되는 변수이다.

3) 선언된 지역을 벗어나면 소멸된다.

 

2. 예제 코드와 실행 흐름

#include<stdio.h>

int SimpleFuncOne(void)
{
	int num = 10; // 이후부터 SimpleFuncOne의 num 유효
	num++;
	printf("SimpleFuncOne num: %d \n", num);
	return 0; // SimpleFuncOne의 num이 유효한 마지막 문장
}

int SimpleFuncTwo(void)
{
	int num1 = 20; // 이후부터 num1 유효
	int num2 = 30; // 이후부터 num2 유효
	num1++, num2--;
	printf("num1 & num2: %d %d \n", num1, num2);
	return 0; // num1, num2 유효한 마지막 문장
}

int main(void)
{
	int num = 17; // 이후부터 main의 num 유효
	SimpleFuncOne();
	SimpleFuncTwo();
	printf("main num: %d \n", num);
	return 0; // main의 num이 유효한 마지막 문장
}
그림1. main 함수의 호출 그림2. SimpleFuncOne 함수의 호출과 종료(반환)
그림3. SimpleFuncTwo 함수의 호출과 종료(반환) 그림4. main 함수의 종료(반환)

 

※ 지역변수는 해당 선언문이 실행될 때 메모리 공간에 할당되었다가, 선언문이 존재하는 함수가 반환을 하면(종료를 하면) 메모리 공간에서 소멸된다.

 

3. 다양한 형태의 지역변수

1) 반복문, 조건문에서의 지역변수

     

그림5. 반복문 내 지역변수

그림5에서 보면 for문에 의한 반복이 중괄호 내에서 이뤄지는 것이 아니라, 중괄호의 진입과 탈출을 반복하면서 이뤄지는 것을 알 수 있다. 따라서 반복이 이뤄질 때마다 변수 num은 메모리상에 할당되고 소멸된다.

 

2) 매개변수

매개변수도 다음 지역변수의 특성을 지닌다.

 

- 선언된 함수 내에서만 접근이 가능하다.

- 선언된 함수가 반환을 하면, 지역변수와 마찬가지로 소멸된다.

 

따라서 매개변수는 지역변수이다.

 

 

전역변수

 

1. 전역변수의 특징

 

1) 프로그램의 시작과 동시에 메모리 공간에 할당되어 종료 시까지 존재한다.

2) 별도의 값으로 초기화하지 않으면 0으로 초기화된다.

3) 프로그램 전체 영역 어디서든 접근이 가능하다.

 

※ 아래의 코드는 전역변수의 특징을 보여주는 코드이다.

#include<stdio.h>

void Add(int val);
int num; // 전역변수는 기본 0으로 초기화됨(전역변수 특징2)

int main(void)
{
	printf("num: %d \n", num); // num = 0 출력
	Add(3);
	printf("num: %d \n", num); // num = 3 출력
	num++;
	printf("num: %d \n", num); // num = 4 출력
	return 0;
}

void Add(int val)
{
	num += val; // 전역변수 num의 값 val만큼 증가(전역변수 특징3)
}

 

2. 참고

1) 전역변수와 동일한 이름의 지역변수가 선언된다면?

해당 지역 내에서는 전역변수가 가리워지고, 지역변수로의 접근이 이뤄진다.

 

※ 아래의 코드는 전역변수와 동일한 이름의 지역변수가 선언된 코드이다.

#include<stdio.h>

int Add(int val);
int num = 1;

int main(void)
{
	int num = 5; // 지역변수 5 우선 적용
	printf("num: %d \n", Add(3)); // num: 12 출력
	printf("num: %d \n", num + 9); // num: 14 출력
	return 0;
}

int Add(int val)
{
	int num = 9; // 지역변수 9 우선 적용
	num += val;
	return num;
}

 

2) 전역변수 많이 사용해도 될까?

전역변수의 변경은 전체 프로그램의 변경으로 이어질 수 있으며 전역변수에 의존적인 코드는 프로그램 전체 영역에서 찾아야 한다. 따라서 전역변수의 선언은 신중해야 한다.


<참고 자료>

윤성우의 열혈 C 프로그래밍

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

구조체 패딩(struct padding)  (1) 2023.12.08
[C언어] 함수의 정의  (0) 2023.11.23
[C언어] Strcpy 함수 주의할 점  (0) 2022.10.04
[C언어] static 변수  (0) 2021.12.26