본문 바로가기

etc.

[C] 지역변수와 전역변수 (메모리 영역 - code, data, heap, stack)

반응형

가장 주된 차이점은

지역변수는 해당지역(함수)를 벗어나면 자동으로 소멸되고,

전역변수는 프로그램의 시작과 동시에 메모리 공간에 할당되어 종료 시까지 존재한다는 것이다

또, 전역변수는 별도의 값으로 초기화하지 않으면 0으로 초기되고, 프로그램 전체 영역 어디서든 접근이 가능하다

변수들이 저장되는 메모리를 살펴보자

 

 

(코드(code / text) 영역)

메모리의 코드(code) 영역은 실행할 프로그램의 코드가 저장되는 영역으로 텍스트(code) 영역이라고도 부릅니다

CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리하게 됩니다

데이터(data) 영역

메모리의 데이터(data) 영역은 프로그램의 전역(global) 변수와 정적(static) 변수가 저장되는 영역입니다

데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸합니다

(힙(heap) 영역)

메모리의 힙(heap) 영역은 사용자가 직접 관리할 수 있는 '그리고 해야만 하는' 메모리 영역입니다

힙 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제됩니다

힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당됩니다

 

스택(stack) 영역

메모리의 스택(stack) 영역은 함수의 호출과 관계되는 지역(local) 변수와 매개변수가 저장되는 영역입니다

스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸합니다

이렇게 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라고 합니다

출처 : TCP


더불어 지역변수는 스택영역에 저장되기 때문에

변수의 크기가 너무 커지면 "스택 오버플로우 (Stack Overflow)" 에러가 발생하기도 한다

(백준사이트에서 런타임 에러로 표시된다고 한다)

이는 Stack의 메모리가 Heap영역을 침범한 것이며, 반대가 될 경우는 힙 오버플로우 에러가 발생한다

반응형