가끔 알고리즘 풀이를 보다보면 배열을 전역 변수에 선언해두는 경우가 종종 있다. 그 이유를 파해쳐보자. 틀린 부분이나 피드백이 있다면 댓글로 알려주면 감사하겠다.
나는 최근 알고리즘 문제를 풀다가 의문점을 발견했다. 아래의 두 코드를 확인해보자.
//첫번째 코드
#include <stdio.h>
int main(){
int a[2001][2001] = {0,};
printf("%d",a[0][0]);
}
//실행 결과 : 없음.
//두번째 코드
#include <stdio.h>
int a[2001][2001];
int main(){
printf("%d",a[0][0]);
}
//실행 결과 : 0
위 두 코드에 차이점을 알겠는가? 그렇다.
첫번째 코드에선 배열 a를 지역 변수로 선언했고.
두번째 코드에선 배열 a를 전역 변수로 선언했다.

직접 만듬 ㅎ,
코드 영역(텍스트 영역)은 우리가 작성한 소스 코드가 실행되는 공간이다. CPU는 코드 영역에 있는 코드들을 하나씩 수행한다.
데이터 영역에는 전역 변수와 정적 변수가 저장된다. 데이터 영역은 프로그램이 시작할 때 할당되며, 종료될 때까지 존재한다.
힙 영역은 개발자가 직접 동적으로 메모리 할당하고 해지하는 공간이다. 힙 영역은 메모리의 낮은 주소에서 높은 주소 방향으로 할당된다. 또한 스택 영역과 Free Store 공간을 공유한다.
지역 변수와 함수 매개변수가 저장되는 공간이다. 스택 영역은 함수가 호출될 때마다 생성되며, 함수 호출이 끝나면 해당 프레임이 사라진다. 스택은 후입선출(LIFO) 방식으로 동작한다. 또한 힙 영역과 Free Store 공간을 공유한다. 스택 영역은 메모리의 높은 주소에서 낮은 주소 방향으로 할당된다.
프로그램의 실행순서
1. 프로그램 실행이 시작되면 텍스트 영역에 있는 코드가 실행된다.
2. 프로그램에서 사용되는 전역 변수와 정적 변수는 데이터 영역에 저장되고, 초기화되지 않은 변수는 BSS 영역에 저장된다.
3. 함수 호출 시 스택 영역에 지역변수와 매개변수가 저장되며, 함수 호출이 끝나면 스택에서 해당 프레임이 제거된다.
4. 동적 메모리 할당은 힙 영역에서 이루어지며, 메모리 해제는 개발자가 직접 관리해야한다.
*참고 BSS 영역이란?
ㅤㅤㅤ초기화되지 않은 전역 변수와 정적 변수를 저장하는 메모리 영역이다.
ㅤㅤㅤ이 영역에 저장된 변수들은 자동으로 0으로 초기화된다.
이제 대충 이해가 되었는가? 그렇다면 다시 코드를 살펴보자.
//첫번째 코드
#include <stdio.h>
int main(){
int a[2001][2001] = {0,}; //지역 변수 스택 영역에 할당됨
printf("%d",a[0][0]);
}
//실행 결과 : 없음.
//두번째 코드
#include <stdio.h>
int a[2001][2001]; //전역 변수 데이터 영역에 할당됨
int main(){
printf("%d",a[0][0]);
}
//실행 결과 : 0
첫번째 코드에서 배열 a는 지역변수로 선언되었고, 스택 영역에 할당된다. 배열 a[2001][2001]은 매우 큰 크기를 가지므로 스택 메모리의 크기를 초과하여 스택 오버플로우가 발생할 수 있다. 즉, 스택 공간이 부족하여 프로그램이 실행되지 않게 된다.
두번째 코드에서 배열 a는 전역 변수로 선언되었고, 데이터 영역에 할당된다. 전역 변수는 프로그램이 시작될 때 메모리가 할당되며, 초기화되지 않은 전역 변수는 BSS 영역에 저장된다. 이 변수는 자동으로 0으로 초기화되기 때문에 a[0][0]의 값이 0으로 출력된다.
따라서 배열을 전역 변수로 선언하면 자동으로 초기화도 해주고, 값도 더 크게 사용할 수 있다!
근데 그렇다고 사용하는 배열 전부다 전역에 두는 짓은 하지 말기
왜냐하면 디버깅이나 유지보수가 어려워질 수 있다. 그러므로 전역 변수를 최소화하고 필요한 경우에만 사용하는 것이 좋다.
지역변수 배열은 스택 영역에 할당되므로 메모리 공간이 제한적이다. 너무 큰 배열을 스택에 할당하면 스택 오버플로우가 발생할 수 있다.
전역 변수 배열은 데이터 영역에 할당되므로 더 큰 배열을 사용할 수 있고, 초기화되지 않으면 자동으로 0으로 초기화된다.
전역 변수를 사용할 때는 메모리 공간을 충분히 확보할 수 있지만, 전역 변수의 과도한 사용은 프로그램을 복잡하게 만들 수 있으므로 최소화해야 한다.
참고한 글들
https://kyoun.tistory.com/34
https://iyk2h.tistory.com/100
https://all-young.tistory.com/17
이 글은 내가 인터넷을 통해 조사하고 이해한 후 작성한 것이므로, 잘못된 부분이 있을 수 있다. 댓글로 잘못된 부분을 지적해주면 수정하도록 하겠다. (힘들게 썻다,, 좋아요 좀 눌러주라 ㅠㅠㅠ) 그 밖에도 궁금한게 있다면 알아서 찾아봐라
와 신입생이 우리보다 코딩잘해...