열정 실천

C언어 메모리 동적 할당 본문

CS/자료구조

C언어 메모리 동적 할당

구운오니 2022. 7. 6. 15:17

메모리 동적 할당이란??

정적 메모리 : 프로그램이 실행하는 순간 프로그램이 사용할 메모리 크기를 고려하여 메모리를 할당하는 기법

(Static Allocation)

 

동적 메모리 : 프로그램이 실행 중에 필요한 만큼 메모리를 할당하는 기법

(Dynamic Allocation) - 힙 영역에 할당

 

 

동적 메모리 할당하기

메모리 동적 할당을 하는 방법은 Malloc, Calloc Relloc 이렇게 3가지가 있다. 

우선 이 함수를 사용하려면 stdlib.h 헤더파일(표준 라이브러리 함수 정의)을 추가해야한다.

Malloc

malloc 은 인자로 전달된 값에 해달하는 크기의 메모리 공간을 힙 영역에 할당하고, 이 공간의 주소값을 반환한다.

- 함수 원형 - 

void* malloc(size_t size);

 

malloc 함수의 반환형은 void이기 때문에 반환값을 변형시키지 않으면 메모리 공간에 접근이 불가능하다. 

그래서 int형 데이터를 동적 할당 할 때에는 아래와 같이 선언해준다.

 

- int형 데이터 저장 - 

int *arr = (int *)malloc(sizeOf(int));

 

 

 

Calloc

Calloc은 할당된 메모리를 전부 0으로 초기화 한다.

 

- 함수 원형 -      * 크기의 변수를 size개 만큼 저장할 수 있는 메모리 공간

void *calloc(size_t n, size_t size)

 

- int 형 데이터 저장 - 

int *arr=(int*)calloc(n,sizeof(int));

 

 

 

Realloc

Realloc은 할당된 메모리를 다시 할당할 때 쓰인다. 값은 그대로 유지되고 공간의 크기만 바꾼다. 

 

- 함수 원형 -       * memblock : 이미 할당한 포인터 변수 /  size : 바꾸고 싶은 공간의 크기

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

- 사용 예 - 

realloc(arr, sizeof(int)*10);

 

 

메모리 해제하기

할당된 메모리는 반드시 free 함수를 통해 메모리를 해제해야한다. 

그렇지 않으면 더 이상 사용하지 않는 메모리가 메모리 누수가 발생하기 때문이다. 

- 함수 원형 -

void free (void* arr);

- 사용 예- 

free(arr)

 

 

 

 

 

위에서 배운 malloc, calloc, realloc,free 를 사용하여 메모리를 할당하고 해제하는 예시.

int size;
scanf("%d", &size); //크기 입력받기

int* arr = (int*)malloc(sizeof(int) * size);  //malloc을 이용하여 메모리 동적 할당
int* arr2 = (int*)calloc(size, sizeof(int));  //calloc을 이용하여 메모리 동적 할당 (초기화 : 0)

realloc(arr, sizeof(int)*10);  // arr을 메모리 40 바이트로 재 할당

free(arr);  // 메모리 해제
free(arr2); // 메모리 해제