본문 바로가기
C언어

C언어 전역변수 초기화

by algosketch 2021. 3. 30.

 알고리즘 문제 풀 때 편의상 전역변수를 많이 사용한다. 전역 변수로 선언하면 선언 후 초기화 하지 않아도 자동으로 0으로 초기화되는 것은 알고 있었다. 사실 이거는 C언어 문법이 주제라기 보다 시스템, 운영체제 얘기에 가깝다.

int a;
int b = 0;

 그런데 위 두 줄의 코드가 다르게 동작한다는 것은 모르고 있었다. 변수는 기본적으로 .data 섹션에 저장되는데, 초기화 되지 않은 전역변수는 .bss 섹션에 저장된다. 명시적으로 초기화 값을 주는 게 더 좋은지 나쁜지가 궁금하지만 알고리즘 문제에서 AC를 받고 못 받을 정도의 차이는 아니라서 넘어가기로 했다.

 문자열, 동적 할당 : heap
 초기화 된 전역 변수 : .data
 초기화 되지 않은 전역 변수 : .bss
 프로그램 코드 : .text
 함수 스택, 지역 변수 : stack

 추가로 프로그램 메모리는 낮은 주소부터 .text .data .bss heap stack 순서인데, heap과 stack 사이에는 프로그램이 사용할 수 있는 여유 공간이 있고 heap은 아래에서부터 채워지고 스택은 위에서부터 채워지므로 런타임에 할당하는 변수나 함수 스택이 많아지면 stack과 heap이 만날 수 있다. -> stackoverflow

 감자도스가 해준 재밌는 얘기로, C언어에서는 .bss 영역에 있는 배열로 포인터 연산을 하여 .text 영역에 침범할 가능성이 있다고...