변수 유효범위는 크게 지역 유효 범위 와 전역 유효 범위로 나누어진다.
지역 유효 범위 : 함수 또는 블록 내부에서 선언되어 그 지역에서 변수의 참조가 가능한 범위
전역 유효 범위 : 2가지로 나눌 수 있는데, 하나는 하나의 파일에서만 변수의 참조가 가능한 범위,
다른 하나는 프로젝트를 구성하는 모든 파일에서 변수의 참조가 가능한 범위이다.
지역변수
- 함수 또는 블록에서 선언되는 변수
- 함수나 블록에서 지역변수는 선언 문장 이후에 함수나 블록의 내부에서만 사용이 가능
- 함수의 매개변수도 함수 전체에서 사용 가능한 지역변수와 같다
- 지역변수는 선언 후 초기화하지 않으면 쓰레기 값이 저장되므로 주의해야 한다.
- 지역변수가 할당되는 메모리 영역을 스택(stack)이라고 한다.
int main(void)
{
int a = 100; /지역변수 선언
....
}
전역변수
- 전역변수는 함수 외부에서 선언되는 변수
- 일반적으로 프로젝트의 모든 함수나 블록에서 참조할 수 있다.
- 전역변수는 프로젝트의 다른 파일에서도 참조가 가능하다. 다만 다른 파일에서 선언된 전역 변수를 참조 하려면 키워드 extern을 사용하여 이미 다른 파일에서 선언된 전역변수임을 선언해야 한다.
- 전역변수는 어디에서든지 수정할 수 있으므로 사용이 편한 장점이 있다.
- 전역변수에 예상하지 못한 값이 저장된다면 프로그램 어느 부분에서 수정되었는지 알기 어려운 단점이 있다.
기억부류와 레지스터 변수
변수는 4가지의 기억부류인 auto, register, static, extern에 따라 할당되는 메모리 영역이 결정되고 메모리의 할당과 제거 시기가 결정된다.
기억부류 종류 | 전역 | 지역 |
auto | X | O |
register | X | O |
static | O | O |
extern | O | X |
키워드 extern을 제외하고 나머지 3개의 기억부류의 변수선언에서 초기값을 저장할 수 있다.
register
레지스터 변수는 변수의 저장공간이 일반 메모리가 아니라 CPU 내부의 레지스터(register)에 할당되는 변수이다.
- 키워드 register를 자료형 앞에 넣어 선언한다.
register int sum;
- 일반 메모리에 할당되는 변수가 아니므로 주소연산자 &를 사용할 수 없다.
- 레지스터 변수는 처리 속도를 증가시키려는 변수에 이용한다. 특히 반복문의 횟수를 제어하는 제어 변수 에 이용하면 효과 적이다.
static
변수 선언에서 자료형 앞에 키워드 static을 넣어 정적변수를 선언, 정적변수는 정적 지역변수와 정적 전역변수로 나눌수 있다.
- 정적변수는 초기값을 지정하지 않으면 자동으로 자료형에 따라 0이나 '\0' 또는 NULL 값이 저장된다.
- 프로그램이 크고 복잡하면 전역변수의 사용은 원하지 않는 전역변수의 수정과 같은 부작용의 위험성이 항상 존재한다.
메모리영역
- 메인 메모리 영역은 프로그램 실행 과정에서 데이터 영역, 힙 영역, 스택 영역 세 부분으로 나뉜다.
- 메모리 영역은 변수의 유효범위와 생존기간에 결정적 역할을 한다
- 변수는 기억부류에 따라 할당되는 메모리 공간이 달라진다.
데이터 영역은 전역변수와 정적변수가 할당되는 저장공간
힙 영역은 동적 할당되는 변수가 할당되는 저장공간
스택 영역은 함수 호출에 의한 형식 매개변수 그리고 함수 내부의 지역변수가 할당되는 저장공간이다.
선언위치 | 상세 종류 | 키워드 | 유효범위 | 기억장소 | 생존기간 |
전역 | 전역변수 | extern | 프로그램 전역 | 메모리 (데이터 영역) |
프로그램 실행 시간 |
정적 전역변수 | static | 파일 내부 | |||
지역 | 정적 지역변수 | static | 함수나 블록내부 | ||
레지스터 변수 | register | 레지스터 | 함수 또는 블록 실행 시간 |
||
자동 지역변수 | auto | 메모리 (스택 영역) |
'C 프로그래밍 > C언어 정리' 카테고리의 다른 글
C언어 정리 9 - 문자와 문자열 (0) | 2021.08.15 |
---|---|
C 언어 총 정리 8 - 함수 기초 (0) | 2021.08.10 |
C언어 총 정리 7 - 배열 (0) | 2021.08.08 |
C언어 총정리 6 - 포인터 변수와 선언 (0) | 2021.08.08 |
C언어 정리 - 5 (0) | 2021.08.05 |