참고 : 위키피디아 동적메모리할당.
동적 메모리 할당 ?
사용자가 정의한 지역변수와 함수는 스택(stack)영역에 저장되고 함수가 호출되면 스택영역의 메모리를 사용하여 커지고 리턴된면 줄어드는 방식으로 메모리가 사용된다.
작성자가 프로그램의 실행 시간 동안 사용할 메모리 공간을 할당받고자 한다면 메모리 동적할당을 이용하여야한다.
메모리 동적 할당이란 사용이 끝나면 운영체제가 쓸 수 있도록 반납하고 다음 요구가 오면 재 할당을 받을 수 있는것을 말하며 동적 할당된 메모리는 힙(heap)영역에 할당되고 해제된다.
C/C++의 경우 동적으로 할당된 메모리는 프로그래머가 명시적으로 해제 하기 전까지 메모리 공간이 계속 유지된다.
힙 영역
동적 메모리 할당은 프로세스의 힙영역에서 할당한다.
프로세스가 종료되면 운영체제에 메모리 리소스가 반납되며 해제되고 그렇지 않은경우 동적 할 당 된 영역은 계속 유지외더 프로그램이 정해진 힙영역의 크기를 넘는 메모리 할당을 요구하면 할당되지 않는다. 따라서 사용이 완료된 프로그래머가 함수를 사용하여 해제하여 반납하는것이 유리하다.
이러한 동적 할당은 함수의 종료 혹은 변수의 영역을 벗어날 경우 자동으로 공간해제가 이루어지는 스택을 사용한 자동변수(지역변수)와 대조된다.
정적 메모리 할당 또한 프로세스 시작할때 이미 정해진 메모리량으로 한정되어 있으므로 프로세스의 시작과 끝까지 그 크기가 유지된다는 점에서 동적 할당과 차이점이 있다.
C 언어 에서의 동적 메모리 할당
C 언어에서는 malloc, calloc 함수로 동적 할당하고
realloc 함수로 재할당하며 free 함수로 해제한다.
관련함수는 C언어의 표준 라이브러리고 stdlib.h에 정의 되어 있다.
malloc함수의 인수로 크기값을 넘겨 요청하면 힙영역관리 함수가 영역에 여유가 있을경우 할당하고 그 메모리주소값을 넘긴다. 실패의 경우 NULL값을 넘긴다.
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
int main(int argv, char *arg[])
{
unsigned char *pdata = 0;
int size;
if (argv >= 2)
size = atoi(argv[1]);
else {
printf("할당할 메모리 크기를 입력 : ");
scanf("%d", &size);
}
pdata = (char *) malloc(size);
if (pdata == NULL) {
printf("동적할당에 실패 했습니다. 요청크기=%d\n", size);
return -1;
}
// 할당 된 영역을 사용한다.
// 할당된 영역 사용이 완료되면
free(pdata );
return 0;
}