DongDD's IT

[C 언어] 메모리 구조 본문

프로그래밍/C,C++

[C 언어] 메모리 구조

DongDD 2017. 9. 5. 15:36

[C 언어] 메모리 구조


메모리 구조

- 프로그램 실행 시 메모리 공간에 프로그램이 쌓이게 된다.

- C언어에서는 Stack, Heap, Data, Code 영역으로 나뉘어진다

1) Code 영역

- 실행되는 프로그램의 코드 부분이 저장되는 영역

- Text 영역이라고도 불림

- 이 부분에 저장된 내용을 하나씩 처리하며 프로그램이 실행됨


2) Data 영역

- 전역변수, 정적 변수 등이 저장되는 공간

- 프로그램 실행 시 프로그래머가 선언한 변수에 대한 메모리 공간이 할당되고 프로그램 종료 시 해제된다.

- 초기화 되지 않은 변수는 BSS영역에 할당되게 된다.


3) Stack 영역

- 지역 변수와 함수 호출 시 매개 변수가 저장되는 공간

- 함수 안에서 변수를 선언할 경우 stack에 쌓이게 되고 함수가 종료되면 소멸된다.

- Stack 영역은 다른 영역과 달리 위에서 아래로 쌓이는 구조로 되어있음(높은 주소 -> 낮은 주소)

4) Heap 영역

- 프로그래머가 동적 할당을 해 생성한 변수가 Heap 영역에 저장된다.



Stack과 Heap은 서로가 있는 위치로 쌓이게 되어 서로의 메모리 공간을 침범할 수 있음

-> Stack overflow : stack이 heap영역을 침범한 경우

-> Heap overflow : heap이 stack 영역을 침범한 경우


소스 코드로 알아보는 영역 별 변수 할당


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
 
int a;    // data 영역에 할당
int b;    // data 영역에 할당
 
void  function(int stack3) {    //stack 영역에 할당
    int stack4;        //stack 영역에 할당
}
 
int main(int argc, char *argv[]) 
{
    int stack1,stack2;        // stack 영역에 할당
    
    char  *heap1 = (char *) malloc(sizeof(char* 100);    //heap 영역에 할당
    int *heap2 = (int *) malloc(sizeof(int* 100);            //heap 영역에 할당
}


cs


- main 함수의 지역변수 stack1, stack2와 function 함수의 매개변수 stack3, 지역변수 stack4는 stack영역에 할당되게 된다.

- 사용자가 동적으로 메모리 할당을 해준 heap1, heap2 같은 경우에는 heap 영역에 할당되게 된다.

- 전역 변수로 선언한 a,b는 data영역의 BSS 영역에 할당되게 된다.


Comments