본문 바로가기
C C++/C언어 기초

C언어의 메모리 구조

by Go! Jake 2022. 7. 9.

프로그램 실행 시 프로그램을 위한 메모리 공간은 운영체제에 의해 미리 마련됩니다. 마련된 메모리 공간에 변수가 선언됩니다.

메모리 구성과 구성별 저장되는 데이터 유형

운영 체제에 의해 할당된 메모리 공간

운영 체제에 의해 할당된 메모리 공간은 아래와 같습니다.

메모리 구조
메모리 구조

메모리 공간을 나누어 유사한 성향의 데이터를 묶어서 저장합니다. 관리가 용이해지고 메모리 접근 속도가 빨라집니다.

 

코드 영역

코드 영역은 실행할 프로그램의 코드가 저장되는 메모리 공간입니다. 따라서 CPU는 코드 영역에 저장된 명령문들을 하나씩 실행합니다.

 

데이터 영역

데이터 영역은 *전역변수와 static 변수가 할당됩니다. 프로그램 시작과 동시에 할당되어 프로그램 종료 시까지 남아있게 됩니다.

*전역 변수와 static 변수의 공통점과 차이점을 간단히 얘기하겠습니다.

공통점: 프로그램 선언 시 생성되고 종료 시 소멸된다는 것. 초기화 값이 있으면 data 영역에, 아니라면 bss 영역에 할당됨. 

차이점: 참조 범위에 차이가 있음. 전역 변수는 소스 파일 내 어느 곳이든, 파일 밖(extern 이용)에서든 참조가 가능함. 전역 변수는 '함수 내'에서 또는 소스 파일로 제한 됨. 또한 함수의 매개 변수로 쓰일 수 없음.

 

힙 영역

힙 영역은 프로그래머가 원하는 시점에 할당하고 원하는 시점에 소멸하도록 하는 변수를 할당합니다.

 

스택 영역

스택 영역은 지역 변수와 매개 변수가 할당됩니다. 함수를 빠져나가면 소멸되는 변수입니다.

아래 예시를 통해 직관적으로 이해 해 보시죠.

#include <stdio.h>

int value = 30;
void solution(int value_sol);

int main() 
{
	int value_main;
	solution(3);

	return 0;
}

void solution(int value_sol)
{
}

 

<1> 전역 변수

int value = 30;
int solution(int value_sol);

main 함수 위에 전역 변수 value가 선언 됨. 데이터 영역에 할당.

데이터 영역: value

힙 영역:

스택 영역:

 

<2> 스택 영역

int main() 
{
	int value_main;
	solution(3);

	return 0;
}

main 함수 내에  int value_main변수가 선언 됨. main 함수 내 지역변수이므로 스택 영역에 할당 됨.

데이터 영역: value

힙 영역:

스택 영역: value_main, solution의 매개 변수 int value_sol

 

마지막으로 main 함수에 return 0; 에 도달하면 세 변수 모두 소멸됩니다.

정리

C언어 메모리 구조는 효과적인 데이터 관리를 위해 아래와 같이 영역을 구분한다.

코드 영역: 프로그램 코드

데이터 영역: 전역 변수, static 변수 (초기화된 경우 data, 초기화되지 않은 경우 bss)

힙 영역: 사용자가 원하는 시점에 할당 및 소멸하는 변수

스택 영역: 매개 변수 또는 지역 변수

댓글