본문 바로가기

미분류

170317 동적할당 과 malloc함수

수업중 어셈블리어 문제를 풀다가 malloc 함수가 나왔는데.. 


그게 뭐죠 ? 분명 배운건데 생각이 안난다.

대충 찾아보니 동적할당이라고 한다.

메모리의 구조부터 정리하면서 들어가 보도록 하자.


1. C언어의 메모리 구조

운영체제가 우리가 실행하는 프로그램을 메모리 공간에 할당 해준다.
밑의 표와 같이 영역이 할당되어 있으며, stack, heap, data 의 영역만 알아보고 넘어가겠다.

              [메모리 영역]

 코드

(기계어로 변환된 코드)

← 코드 영역



전역변수

static 변수

← 데이터 영역


←힙(Heap) 영역


    











← 스택(stack) 영역

 프로그래머 할당

.

.

.

(런타임에 크기 결정)

(컴파일 타임에 크기 결정)

.

.

.

지역변수

매개변수


1) 데이터(Data) 영역

- 전역변수와 static 변수가 할당되는 영역
- code영역과 data영역은 프로그램이 시작하면서 동시에 메모리에 올라오고 프로그램이 종료되면서 소멸.

 #include<stdio.h>

 int a = 10;

 int b = 20;


 int main(){

       ....

     return 0;

 }

 

 a = 10 , b = 20

 힙 영역

.

.

.

.

.

.

스택영역


변수 a와 b는 전역변수로  main함수가 호출되기전에 데이터영역에 할당된다. 

프로그램이 끝나기전까지 존재 하기 때문에 다른 함수에서도 호출될때 이 변수를 활용 할 수 있다.


2) 스택(stack) 영역

- 함수 호출시 생성
- 함수 종료시 삭제


 #include <stdio.h>


void fct1(int);

void fct2(int);


int a=10;

int b=20;


int main(){

    int i = 100; // main스택프레임부에 할당


    fct1(i);

    fct2(i);


    return 0;

}


void fct1(int c) {

    int d=30; // fct1 스택 프레임부에 할당

}


void fct(int e){

    int f=40; // fct2 스택 프레임부에 할당

}



 a = 10 , b = 20

 









main()

 힙 영역

.

.

.

.

.

.

스택영역

 i = 100

                                ▼


 a = 10 , b = 20

 










fct1()

main()

 힙 영역

.

.

.

.

.

.

스택영역

 c=100, d=30

 i = 100

                      fc1() 함수가 끝나면 삭제되고 

                      다음함수 실행 (에필로그 및 인자정리)

                               ▼

 a = 10 , b = 20

 










fct1()→fct2()

main()

 힙 영역

.

.

.

.

.

.

스택영역

 e=100, f=40

 i = 100

 



3) Heap영역

- 필요에 의해 동적으로 메모리를 할당 할 때 사용

* 힙영역을 사용하는 이유 ?

 : 스택영역에 할당된 메모리의 크기는 컴파일타임에 결정되는데, 배열을 생성할 경우에 
 arr[i] 처럼 정해지지않은 크기로 선언을 할 경우라든지 사용자의 요구에 따라 그 크기가 바뀌는 경우가 있다.
 즉 실행전에 이미 정해져있는 값이 아닌 프로그램을 실행되는 동안(런타임)에 값이 결정되는 경우 사용해야한다.


 int main(){

     int i = 0 ;

     scanf("%d", &i);

     int arr[i];


     ruturn 0 ;

 } 


i의 크기가 4바이트라는 것은 알수 있으나 arr의 배열의 크기는 알 수 없다.

이 부분은 런타임시에 결정이 되기 떄문에 동적으로 할당 해 주어야 한다.


2. malloc 

- 동적으로 메모리를 할당하는 함수

 #include <stdlib.h>

  void* malloc(size_t size)  


함수호출시 지정한 크기만큼 메모리를 할당하고 

그 주소(첫번째 바이트의 주소)를 리턴받는다.

메모리할당에 실패하면 NULL이 리턴된다.


리턴값이 주소기 때문에 값을 참조하기 위해서는 포인터를 사용해야 한다.

그래서 void*이 나오는것.

- free함수 

: 할당된 메모리영역을 해제해 줘야한다. 동적할당의 단점은 명시적으로 해제를 해줘야 한다는 것.

 #include<stdlib.h>

  void free(void* ptr)



ex)malloc 함수 사용 예제

 #include<stdio.h> 

 #include<stdlib.h>


 int main(void){

    int* a;

    a = (int*) malloc(sizeof(int));

    

    if(a == NULL) 

    {

       puts("메모리 할당 실패");

       exit(1);

    }


    *a = 20;

    printf("힙에 저장된 변수 a: %d \n", *a);

    

    free(a); // 메모리 해제

    return 0;

a = (int*) malloc(sizeof(int)); 부분에서 메모리를 할당하고 

if 문은 리턴이 null값이면 메모리할당에 실패한 것이므로 그 유무를 체크해 준다.

마지막에 free로 할당된 메모리를 해제 해 주어야 한다.


 

* malloc 함수 사용 예제 : https://www.joinc.co.kr/w/Site/C/Documents/malloc

 

 

'미분류' 카테고리의 다른 글

DDoS 공격 유형 정리#1  (0) 2018.06.15
DDoS 공격 대응  (0) 2018.06.15
170316 어셈블리 언어  (0) 2017.03.16
170316 Caller & Callee , 함수 호출 규약  (0) 2017.03.16
170314 리눅스, 우분투 설치 및 C 소양교육  (0) 2017.03.16