[CS] 전역변수는 왜 자동으로 초기화가 될까?
아마 여러 알고리즘을 풀면서 전역변수로 선언을 하게 되는 일부 변수들이 있다. 대체로 메인과 함수 등 여러 곳에서 사용하기 위함도 있겠지만, 자동으로 초기화가 되기에 NULL로 인해 생기는 문제들에 대한 것도 해결이 되기에 전역변수를 쓰는 경우도 분명히 존재한다.
본인도 위의 두가지의 경우에 전역변수를 사용하는데, 전역변수가 자동으로 초기화가 되는 부분에 대해 궁금증이 생겨 포스팅을 하게 되었다.
전역변수
전역변수란 어떤 변수 영역 내에서도 접근할 수 있는 변수를 의미한다. 프로그램이 시작되어 메모리에 할당이 되면, 죽을 때까지 계속 메모리에 남아있는 친구이다.
하나의 변수를 프로그램 전반에 걸쳐 사용할 수 있다는 점이 전역변수의 가장 큰 특징이다. 하지만 전역변수를 남발할 경우 코드가 꼬여버릴 수 있다. 특히 프로그램의 덩치가 커지면 변수명이 겹치는 문제가 있기에, 필요에 따라 전역으로 선언하는 것은 중요한 부분이다.
왜 초기화 될까
지역변수와 전역변수를 선언만 하고 초기화를 하지 않은 상태에서 바로 출력을 한다면, 지역변수는 쓰레기 값이 나오고, 전역변수는 깔끔하게 초기화가 되어있는 상황을 볼 수 있을 것이다. 이는 변수의 저장 위치가 다르기 때문에 발생하는 결과이다.
메모리 구조
지역변수는 메모리의 Stack Segment에 저장되며, 선언된 함수가 종료되면 메모리에서 사라진다. 반면 전역변수의 경우 초기화 유무에 따라 저장 위치가 달라진다. 하지만 지역변수의 경우 초기화 유무에 따라 저장장소가 바뀐다.
만일 전역변수가 초기화되었다면 Data Segment에 저장된다. Data Segment는 ROM에 있어서 한번 선언되면 값을 수정할 수 없는 문제가 생긴다. 따라서 Data Segment는 RAM에 복사한 후 런타임에서 수정되는 값은 RAM에 저장한다. 즉, Data Segment는 ROM, RAM 두 영역 모두를 필요로 한다. 대신 프로그램이 끝날 때까지 값이 저장되어 있다.
하지만 초기화 되어있지 않은 전역변수의 경우 BSS Segment에 저장된다. BSS Segment에 있는 변수들은 스타트업(Startup.s) 시에 reset 핸들러가 BSS Segment의 변수들을 0으로 채우는 과정을 거친다. 따라서 BSS Segment에 속하는 전역변수는 자동으로 0으로 초기화된다.
참고
전역변수와 지역변수 : https://hydroponicglass.tistory.com/182
BSS, Data 세그먼트 : https://clansim.tistory.com/30
Stack 세그먼트 : https://codebreaking.tistory.com/46