C언어

[C언어] 동적할당 (dynamic allocation)

yujin0517 2021. 9. 6. 23:05

동적 할당(dynamic allocation)

동적 할당은 힙 영역에 동적으로 메모리를 할당하는 것을 말합니다.

힙 영역은 메모리 할당과 해제가 자유롭습니다. 하지만 메모리 해제( free() )는 제대로 해줘야 합니다.

메모리 해제를 하지 않을 경우 메모리 낭비가 일어나게 됩니다. 

malloc() 이외에도 calloc(), realloc() 등이 있습니다. 

 

<mallod 사용법>

자료형* 포인터명 = (자료형*)malloc(sizeof(자료형)*크기);  //사용법1
자료형* 포인터명 = (자료형*)malloc(크기);                //사용법2

 

 

동적 할당 초기화(clear allocation) -> calloc()

자료형* 포인터명 = (자료형*)calloc(크기, sizeof(자료형));

 

동적 할당 크기 변경(resize allocation) -> realloc()

자료형* 포인터명1 = (자료형*)malloc(sizeof(자료형)*크기);  //이미 할당된 메모리
자료형* 포인터명2 = (자료형*)realloc(포인터명1, sizeof(자료형)*변경할 크기);  //포인터명1 메모리 크기 변경하기

 

** 동적 할당 메모리 해제 -> free()

free(포인터명);

* 메모리를 해제하지 않으면 메모리 낭비가 일어나기에 꼭 free함수로 메모리를 해제해야 함.

 

* 명시적 형변환

malloc함수

malloc 함수는 리턴 타입이 void입니다. 그럼에도 malloc함수에는 명시적 형변환을 해줘야 합니다.

동적 할당을 할 때 (자료형*)으로 형변환을 해주지 않으면 Segmentation fault라는 오류를 접할 수 있습니다. 

calloc함수와 realloc함수도 마찬가지로 명시적 형변환을 해줘야 합니다. 

 

동적 할당 사용 예제

메모리를 할당(malloc)하고, 메모리 초기화(calloc), 크기 변경(realloc) 함수를 사용하여, 1 ~ 10까지 출력하기  

#include <stdio.h>
#include <stdlib.h>

void main() {

	int* mArr = 0;
	int size = 0;

	mArr = (int*)malloc(sizeof(int) * 5);
	mArr = (int*)calloc(size, sizeof(int));
	mArr = (int*)realloc(mArr, sizeof(int) *10);

	for (int i = 0; i < 10; i++) {
		mArr[i] = i + 1;
	}

	for (int i = 0; i < 10; i++) {
		printf("%d ", mArr[i]);
	}
	printf("\n");
	free(mArr);
}

마지막에 free함수를 사용하여 꼭 메모리 해제하기!!

 

<콘솔창>

 

* 동적 배열 사용법(2가지)

  1. *(mArr + i)
  2. mArr [i]

 

다음 글에서 메모리를 할당받아 동적 배열을 만드록 정렬까지 하는 코드를 설명하겠습니다.

감사합니다!

 

2021.09.06