C언어 변수의 유효 범위 - 전역 변수, 지역 변수, 정적 변수, 레지스터 변수
본문 바로가기
CS/알고리즘 및 자료구조

C언어 변수의 유효 범위 - 전역 변수, 지역 변수, 정적 변수, 레지스터 변수

by IYK2h 2020. 8. 7.
728x90

C언어에서는 범위에 따라 변수의 접근에 제한이 있다.

변수의 종류에 따라 유효 범위, 초기화 유무, 선언 위치, 메모리 소멸 시기, 저장장소 등등 조금씩 차이가 있다.

 

전역 변수


함수 외에서 선언을 하고 프로그램 전체에서 유효하다.

전역 변수는 선언 시 초깃값이 0으로 초기화된다.

전역 변수는 프로그램이 종료 시 전역 변수의 메모리는 소멸된다.

#include <stdio.h>

int	local_variable; //전역변수 선언, 초기값 0

int	main() 
{
	printf("%d",local_variable); //local_variable 변수는 전역 변수이기 때문에 변수 사용 가능
	return 0 ;
}

//결과값 0

 

지역 변수


함수(블럭) 내에서 선언을 하고 함수(블럭) 내에서만 유효하다. 블록이 종료되면 메모리는 소멸된다.

*C언어에서 중괄호로 묶은 부분을 블럭이라 한다.

*배열을 선언할 때 값을 지정할 때 사용되는 중괄호는 예외다.
지역 변수는 선언 시 초깃값이 초기화가 안되어 있어 쓰레기 값이 들어간다.

//블럭 형태
void function()
{
    // 함수의 블록
}

for (;;)
{
    // fo문의 블록
}

if (조건)
{
    // if문의 블록
}

{
    // 중괄호만으로 이루어진 블록
}
#include <stdio.h>

int main()
{
	int	num1 = 11; 
    {	//블럭 시작
        int num2 = 22;			//블럭 내의 변수 선언 지역 변수
        printf("블럭 내에서의 num1 print test : %d\n", num1);	// 결과 11
    }	//블럭 종료
    printf("블럭 외에서의 num2 print test%d\n", num2); //컴파일 에러
    //num2는 블럭내에서 선언해서 블록 바깥에서는 num1을 사용할 수 없다
	
    return 0;
}

num1은 블럭 내부에 있는 printf에서 출력이 가능하다.

num1은 main함수가 끝이 나야 소멸되는 변수이다, 그래서 블럭 내부에서도 num1의 값은 존재하기 때문에 출력이 가능하다.

변수 num2는 두 번째 중괄호(블럭) 내에서 선언된 지역 변수이다.

num2가 선언된 중괄호가 끝이 날 때 num2도 소멸된다.

그래서 두 번째 printf에서 출력을 하지 못하고 컴파일 에러가 난다.

이해를 돕기위한 예시1
이해를 돕기위한 예시2

 

정적 변수


C언어에서 정적 변수란 static 키워드로 선언한 변수를 의미한다.

정적 변수는 전역 변수와 지역 변수의 특징을 모두 가진다.

정적 변수는 초깃값이 단 한번 초기화된다. 초기화는 최초 실행 시 단 한 번만 실행된다.

이렇게 선언된 정적 변수는 지역 변수처럼 해당 함수(블럭) 내에서만 접근 가능하고, 프로그램이 종료 시 메모리가 소멸된다.

정적 변수는 코드로 보는 게 이해하기 쉽다.

#include <stdio.h>

int main()
{
	int	num = 5;
	int	i = 0;

	while(i<3)
	{
	static int	num1 = 10;

	num1 = num + num1;
	printf("num1 : %d\n",num2);
	i++;
	}
}

이해를 돕기위한 예시3

레지스터 변수


지역 변수를 선언할 때 register 키워드를 붙여 선언한 변수.

레지스터 변수는 CPU의 레지스터 메모리에 저장되어 빠르게 접근할 수 있게 된다.

 

 

728x90

댓글