전공지식정리/영상처리(Image Signal Processing)

동적할당

TimeSave 2022. 1. 20. 21:13

프로그램의 메모리공간은

- 프로그램 실행 시, RAM에 변수선언(지역변수,전역변수)를 위해 할당된다.

 

- stack, heap, data영역으로 나뉘어 진다.

 

1. Data 영역

 - 전역변수와 static변수가 할당된다.

 - 시작과 동시에 할당, '프로그램' 종료시 소멸

 

2. stack 영역

- '함수 호출시' 지역변수와 매개변수가 할당된다.

- '함수 호출 완료' 시 삭제(소멸) // 종료 보다 호출 완료가 적합하다 생각

- 컴파일 하면서 메모리 계산

 

3. heap영역

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

- 실행하면서 메모리의 크기를 그때 그때 결정할 때 사용

 

from http://dsnight.tistory.com/50

 

결론 : 동적할당은 메모리(stack, data, heap)에서 heap영역을 사용하는 기술

 

1. malloc() : 동적으로 메모리를 할당하는 기술  // memory allocation

   void* malloc(size_t size)

  ex)

         int i* = (int*) malloc( size of(int) );

 

- void* : 개발자가 알맞게 반환형을 결정하라고 설정, 예제에서는 int*로 변환하였다.

- malloc함수가 int의 size(4byte)를 heap에 할당한다.

- 메모리의 주소가 void*로 return된다

- void*를 int*로 변환

- 포인터 i에 주소값 대입(int*)

 

응용)

 arr_2 = (int*) malloc(size of (int) *5);  처럼 곱하여 데이터 할당할 때 사용

 

  => cf) calloc(size_t elt count, size_t elt size)

       - 요소가 int형 5개인 것을 알고 있을 경우 

       - elt count =5, elt size = size of(int)를 대입 =>  calloc(5,size of (int))

       - 위의 예제와 비슷하게 사용가능

       - 차이점은 0으로 초기화 시켜주는것.

 

2. free() : heap에 할당된 메모리 해제

 - 위에서 보면 arr_2에 malloc()를 사용했는데 

 - free(arr_2); 를 넣으면 메모리가 해제된다.

 

3. realloc() : 할당된 메모리 크기 변경(재할당) / re allocation

void* realloc(void* memoryblock, size_t size);

사용 : malloc에서 반환된 주소포인터를 대입하고 , malloc처럼 원하는 사이즈를 대입한다.

 

 

응용예 => http://gis8282.tistory.com/entry/13-%EB%8F%99%EC%A0%81-%ED%95%A0%EB%8B%B9