[C, C++] 전역변수와 정적변수가 0으로 초기화되는 이유

전역변수(global), 정적변수(static), 지역변수(local)

초기화를 하지 않은 전역변수, 정적변수, 지역변수를 선언하고 출력해보았다.

int g; // 전역변수
int main(void){
    static int s; // 정적변수
    int l; // 지역변수
    printf("global : %d, static: %d, local : %d", g, s, l); 
}

위 코드를 실행하면 아래와 같은 출력을 얻는다.

global : 0, static: 0, local : 4194432

따로 초기화를 하지 않았지만 전역변수(global)와 정적변수(static)는 자동으로 0으로 초기화되었고 지역변수(local)는 초기화를 하지 않아서 쓰레기 값이 들어갔다. 이는 변수의 저장 위치가 다르기 때문에 발생하는 결과다.

Data, BSS, Stack

지역변수는 메모리의 Stack Segment에 저장되며 선언된 함수가 종료되면 메모리에서 사라진다. 그리고 초기화된 전역변수와 정적변수는 Data Segment에 저장된다. Data Segment는 ROM(Read Only Memory)에 있어서 한번 선언되면 값을 수정할 수 없는 문제가 생긴다. 따라서 Data Segment는 RAM(Random Access Memory)에 복사한 후 런타임에서 수정되는 값은 RAM에 저장한다. 즉 Data Segment는 ROM, RAM 두 영역 모두를 필요로 한다. 대신 프로그램이 끝날 때까지 값이 저장되어 있다.

마지막으로 초기화되지 않은 전역변수와 정적변수는 BSS Segment에 저장된다. BSS Segment에 있는 변수들은 스타트업(Startup.s)시에 reset핸들러가 BSS Segnment의 변수들을 0으로 채우는 과정을 거친다. 따라서 BSS Segment에 속하는 전역변수는 자동으로 0으로 초기화된다.

변수메모리
지역변수Stack
초기화 된 전역변수, 정적변수Data
초기화 되지 않은 전역변수, 정적변수BSS

참고

https://clansim.tistory.com/30

http://recipes.egloos.com/5317479

임베디드 시스템 아키텍처(에이콘, 다니엘 라카메라)

Leave a Comment