C & C++/C

[C] 메모리와 변수의 lifetime으로 인한 예상치 못한 결과

Razelo 2021. 10. 8. 12:58

글 앞 내용에 잘못된 내용이 등장합니다. 혼자서 추측했던 내용이라 잘못된 내용인데 그냥 결과만 확인하고 싶은 분은 글 맨아래로 가셔서 파란색 문단을 읽으시면 됩니다. 

 

굉장히 신기한 내용을 접하게 되었다. 우선 아래 코드를 먼저 보면 아주 간단한 코드인데 척 보면 무슨 결과가 나올지 짐작일 갈 것이다. 

 

#include<stdio.h> 
int fun() 
{ 
static int count = 0; 
count++; 
return count; 
} 

int main() 
{ 
printf("%d ", fun()); 

printf("%d ", fun()); 
return 0; 
}

 

위와같은 코드를 봤을때, 딱 보면 아 static으로 선언되있기는 한데 그런데 어차피 다시 또 0으로 초기화를 해주기 때문에 결과가 1 1 이 나오겠구나라고 생각할 수 있다. 

 

그런데 결과는? 정말 신기하게도 1 2 가 나온다. 

 

그리고 이 이유는 해당 함수에서 현재 초기화를 하는것과는 별개로 변수의 lifetime과 관련지어 설명할 수 있다. 

fun을 현재 2번 부르고 있다. 즉 local변수에 현재 계속 접근하고 있다. 이 경우 변수가 사라지지 않고 아주 짧은 시간동안 메모리에 그대로 상주하고 있게 되는데 그때 바로 이 메모리의 변수에 다시 접근하게 되어서 count++를 수행하고 이를 통해 1 2 라는 결과가 나오게된다는 것이다.  

 

처음에 딱 봤을때는 이게 무슨소린가 왜 이런결과가 나오나 싶었다. 근데 생각해보니 실제로도 이렇게 1 2 로 나오는 것을 확인하니 조금 이해가 되게 되었다. 

 

역시 매번 신기한게 하나둘 예상치못한곳에서 튀어나온다. 

 

(요약: static변수가 현재 선언되어있는데 fun함수를 부르고 나오면서 사실은 해당 영역에서 빠져나왔으므로 해당 변수가 사라지게 되고 다시 fun함수를 부른곳에서 또 해당 static int에 접근하려 하고 있기에 그 짧은 순간에는 아직 메모리에서 사라지지 않고 메모리셀을 붙잡고 있는 것이다. 그래서 1 2 가 나온다. )

 

의문점: 

근데 그렇다면... 메모리셀을 붙잡는것까지는 알겠다만 0으로 할당이 되는 것은 아예 실행조차 안되는 것인가? 만약 메모리셀을 잡고 있다고 하더라도 0으로 할당하는 코드가 있다면 잡고 있는 해당 메모리셀에 0으로 다시 초기화하고 1이 출력되는 과정이 있어야 하는것아닌가? 아무래도 이 부분은 어느 곳에서 답을 찾아야할지 감이 잘 안잡힌다. 스코프? 변수의 lifetime? 메모리셀의 초기화? 

...

...


이 이후에 좀더 고민을 해보고 그 결과 답을 알아냈는데 정말 안타깝게도 와이파이가 끊긴상태에서 완료를 눌렀다가 썼던 글이 다 날라갔다. 고민한 과정과 최후 결론이 다 나왔는데 그 사이가 사라진게 좀 아쉽다. 진짜 많이 썼는데 한꺼번에 다 날라갔다... 담부터 인터넷 연결 확인하자. 아니면 글을 길게 쓴다면 임시저장이라도 누르자. 

 

어찌됬든 다시 그 긴 과정을 쓰기도 귀찮고 이미 뭐가 문젠지도 알아냈으니 답부터 말하겠다. 

 

이건 완전히 static에 대한 내 착오였다. 

 

static int count = 0 즉 이 코드는 컴파일시 최초 단 1회 실행이 된다. 즉 이후에는 할당 즉 초기화가 작동하지 않는다는 것이었다. 나는 이것도 모르고 스코프며 메모리셀이며 lifetime이며 하는 문제를 고민하고있었던거다. 너무 빙빙 돌아서 생각했다. 개념하나를 모르고 있어서 이런 문제가 발생했다. 

 

 

반응형