안녕하세요 밥한그릇입니다.
오늘은 변수들의 종류, 그리고 그 scope와 lifetime에 대해 알아보는 시간을 가질거에요.
다음 C 예제코드를 보고 그 scope와 lifetime에 대해 추측해봅시다.
int x;
static int y;
int f(int v) {
static int a = 0;
int b;
...
a++;
b = a + v;
...
}
다음과 같은 예제 코드가 주어졌을 때, 변수 x, y, v, a, b 의 scope와 lifetime은 각각 어떻게 될까요?
int x : 전역 변수
static int y : 정적 전역 변수
int v : 지역 변수 (매개변수)
static int a : 정적 지역 변수
static int b : 지역 변수
위 변수들은 이러한 종류로 구분됩니다.
정답은 다음과 같습니다.
1. x : <이 파일 및 이 파일을 참조하는 다른 파일에서도 사용 가능, 프로그램의 시작 ~ 끝>
전역변수인 x는 프로그램 실행 시 이 파일을 참조하는 다른 파일에서 extern int x;와 같은 형태로 선언될 경우 참조될 수 있습니다. 전역변수이므로 이 프로그램의 시작부터 끝까지 메모리가 유지됩니다.
2. y : <이 파일 내부에서만, 프로그램의 시작~끝>
static이라는 키워드를 붙이면 정적 변수로 선언되어, 변수의 범위가 이 파일 범위로 제한됩니다.
전역변수이므로 이 프로그램의 시작부터 끝까지 메모리가 유지됩니다.
3. v : <이 함수 f 내에서만, 함수 실행 ~ 종료 시>
v는 함수 호출 시 복사되어 온 값입니다. 이 함수가 실행되는 동안만 lifetime이 지속되며, 이 함수 안에서만 사용될 수 있습니다.
4. a : <함수 내부에서 쓸 수 있는 지역 변수, 프로그램 종료 시까지 (영원히)>
static 지역변수는 특별한 의미를 갖습니다. 프로그램의 data 영역에 선언되어 static 지역 변수가 있는 함수가 끝나도 그 값을 유지합니다.
Data 영역에 초기화되기 때문에 그렇습니다.
지역 변수이므로 지역변수 특유의 scope(함수 내부)를 가집니다.
5. b : <지역 변수, 함수 종료 시>
이때 만일 b가 main함수의 지역변수라면, 그 lifetime은 프로그램의 시작~끝이라고 볼 수 있습니다.
아까 static 지역 변수가 특별하다고 했는데, 그 예시를 다음과 같이 직접적으로 살펴볼 수도 있습니다.
static으로 선언한 경우에는 값이 1이 아닌 2로 늘어난 것을 볼 수 있습니다. static 변수의 초기화는 첫 호출 시 한번만 이루어지고, 이전의 값이 사라지지 않습니다. 때문에, 함수를 호출할때마다 a의 기존의 값에서 값이 더해지는 모습을 볼 수 있습니다.
그러나 static이 아닌 일반 지역변수로 선언한 경우에는 변수 a의 메모리가 temp()가 한번 실행되는 동안만 유지되기 때문에 그 값이 매번 새롭게 초기화되어 1이라는 출력을 유지하는 것을 볼 수 있게 됩니다.
참고) 이 포스팅은 다음의 포스팅을 참고하였으며, 더 많은 정보를 얻으시려면 다음 링크를 참고하세요.
'IT > 학과 공부' 카테고리의 다른 글
[C] 읽기 전용 메모리 공간 (0) | 2022.08.03 |
---|---|
[컴파일러] LR 파서 문제 풀이 (0) | 2022.06.11 |
[컴파일러] LL(1) 파서 문제 풀이 (0) | 2022.06.11 |
[컴파일러] LL 파서와 LR 파서 (0) | 2022.06.10 |
C에서 시그널을 보내고 처리하는 방법 (kill, signal, sigaction) (0) | 2022.01.06 |