easy software

C언어의 메모리 구조 본문

C언어/메모리 관리와 동적 할당

C언어의 메모리 구조

JAVA 웹개발자 2015. 2. 13. 12:54

abcd.exe 와 같은 실행파일을 실행하려면 파일이 메모리에 적재되어야 합니다.

 

즉, RAM이라 불리우는 메인 메모리에 프로그램이 올라가 있어야 한다는 뜻이죠.

 

그럼 C언어의 메모리 구조는 어떤식으로 되어있을까요?

 

C언어의 메모리 구조는 아래와 같습니다.

 

 

 

 

총 네가지의 영역으로 구분할 수 있습니다.

 

- 코드 영역 : 프로그램을 실행하기 위한 코드가 적재됩니다.

 

- 데이터 영역 : 전역변수, static 변수가 적재됩니다.

 

- 힙 영역 : 프로그래머에 의해서 메모리가 관리되는 곳입니다.

   (차후 기회가 되면 포스팅하겠습니다)

 

- 스택 영역 : 함수 호출 시 생성되는 지역변수와 매개변수가 적재되는 영역입니다.

 

 

전역 변수와 static변수는 프로그램의 시작과 동시에 바로 데이터 영역에 적재됩니다.

 

그리고 프로그램이 끝날때 까지 소멸되지 않는 특징이 있습니다.

 

반면에 스택영역은 함수호출시 변수들이 저장되며, 함수의 리턴이 완료되면 자동소멸됩니다.

 

 

아래와 같은 코드를 실행하면 메모리에는 어떤식으로 적재되는지 알아보겠습니다.

 

 

#include <stdio.h>

 

void func1(int);

void func2(int);

 

int main(void){

int arg = 10;

 

func1(arg);

 

return 0;

}

 

void func1(int a){

func2(a);

}

 

void func2(int b){

int c = b;

}

 

 

 

 

 

생성 단계

 

1. main함수가 호출되면서 arg = 10이 스택 영역에 적재됩니다.

 

2. func1이 호출되면서 매개변수인 a = 10 이 스택 영역에 적재됩니다.

 

3. func2가 호출되면서 매개변수인 b = 10, 지역변수인 c = 10이 스택 영역에 적재됩니다.

 

 

소멸 단계

 

1. func2함수호출이 끝나면 b = 10, c = 10이 소멸됩니다.

 

2. func1함수호출이 끝나면 a = 10이 소멸됩니다.

 

3. main함수의 종료는 프로그램의 종료를 뜻합니다. 모든 영역이 비워집니다.

 

 

만약, main함수 내에서

 

func1(a);

func2(a);

 

순으로 함수가 호출되면 func1의 함수가 리턴되고 나서 func2가 호출됩니다.

 

그리고 전역변수와 static변수는 프로그램 시작과 동시에 데이터 영역에 저장되었다가,

 

프로그램이 종료되면 소멸된다는 것을 기억하시기 바랍니다.

Comments