동적 메모리 할당이란, 프로그램이 실행 도중에 동적으로 메모리를 할당받는 것을 말한다. 프로그램에서는 필요한 만큼의 메모리를 시스템으로부터 할당을 받아 사용하고, 사용이 끝나면 시스템에 메모리를 반납해야 한다. 필요한 만큼만 할당을 받고 또 필요한 때에 사용하고 반납해 메모리를 효율적으로 사용할 수 있는 것이다.
동적 메모리는 일종의 물건 빌려가는 곳에서 물건을 빌려가는 것과 비슷하다고 생각하면 된다. 물건을 빌려가서 다 쓰고 다시 돌려줘야 하는 것처럼, 메모리도 빌려갔다가 다 쓰고 다시 돌려줘야 한다. 이 hip 영역에서 메모리를 빌려오고, 다 사용하면 다시 돌려놓는다.
다시 말하면, 동적 메모리의 사용이 끝나면 반드시 그 메모리의 영역을 명시적으로 반납해야 한다는 말이다.
동적 메모리 할당의 예시를 들겠다.
#include<stdio.h>
#include<stdlib.h>
voidmain(){
int* p =NULL; p =(int*)malloc(sizeof(int));//malloc으로 메모리 할당
if(p ==NULL){
printf("동적 메모리 할당 실패");
exit(1);
}
*p =321;printf("%d",*p);
free(p);//동적 메모리 사용 후 메모리 반환
}
// 출력값 : 321
우선 int *p를 통하여 포인터변수 p를 선언했다.
동적으로 할당된 메모리를 사용하기 위해선, 힙 영역에 할당된 메모리의 시작 번지를 알아야 하므로 반드시 포인터 변수가 필요하다.
malloc 코드는 메모리를 할당해주는 코드이고, 그 안의 괄호값은 얼마만큼의 메모리를 할당할까에 대한 코드이다. int형이 4바이트이므로 저 괄호 안의 값을 4라고 해도 되겠지만, int가 항상 4바이트라는 보장이 없으므로, 여기 안에도 sizeof로 크기 계산을 해주는 것이 좋다.
malloc 앞에 (int*)로 형변환을 해주었다.
이 형변환을 해 주는 이유는, malloc 함수는 메모리만 확보하여 사용할 수 있게 해주는데, 그 안에 어떤 타입의 자료가 저장될 지 정해지지 않았기 때문에 void* 타입을 반환하기 때문이다.
이렇게 된다면, 저장될 타입이 미정인 메모리의 주소를 반환하는 것이기 때문에 저장할 타입에 맞춰 형변환을 해 주어야 한다.
이후 if안의 코드는, 포인터변수 안에 변수값으로 주소가 할당이 되지 않았을 경우 exit(1); 코드를 통하여 프로그램을 종료시킨다.
*p = 321;을 하고 *p를 출력하였으므로, 출력값이 321이 나오는 것은 일단 당연하다.
댓글 영역