알고리즘 문제 풀 때 편의상 전역변수를 많이 사용한다. 전역 변수로 선언하면 선언 후 초기화 하지 않아도 자동으로 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 영역에 침범할 가능성이 있다고...
'C언어' 카테고리의 다른 글
C언어 기초 part 2-7. 함수 포인터 (0) | 2020.06.10 |
---|---|
C언어 기초 part 2-5. 더블 포인터 (0) | 2020.06.01 |
C언어 연재, 앞으로의 계획 (0) | 2020.03.24 |
C언어 기초 part 2-4. 문자열 (2) | 2020.03.20 |
C언어 기초 part 2-3. 포인터 (20.03.27. 내용 추가) (0) | 2020.03.03 |