제목에 있는 3개의 함수 malloc, callc, realloc에대해 알아보자..
이 3개의 함수중 malloc 즉 '말록' 함수는 아래와 같이 앞서 배열과 포인터 부분에 잠시 나온 적있다.
int *arr = (int*)malloc(sizeof(int) * 3);

여기서 따로 설명한다고 적었는데.. 이는 말록만 있는게 아니라 씨알록과 리알록 이 존제하기 때문이다.
우선 이 함수의 원형은 아래와 같다.

void* malloc(size_t size);
우선 기능 부터 알아보자면.. size로 입력받은 바이트만큼 (3을 넘겼으면 3바이트) 메모리를 생성후 시작 주소를 넘겨주는 애가 바로 이 말록 함수다. 그런데 앞에 void 같은데 어찌 넘겨준다는것일까.. 잘 보면 반환형 부분이 일반 void가 아니라 void의 포인터형이라는 것을 알 수있다. 그냥 void는 아무것도 없음을 의미하지만. void 포인터는 특정형식이 없음을 의미한다. 즉,, int가 올수도 있고 char이올 수도 있고 그밖의 자료형이 올 수도 있다. 반환형이 void 포인터인 이유는 어떤 데이터가 들어갈지 모를 메모리의 주소를 넘겨주기 때문이다.(어떠한 값이든 메모리의 주소는 숫자로 되어있다) 그럼 이 값을 어떻게 사용할까.. 바로 사용할려하면 형변환에러가 뜨므로 안된다. 그러나 이외로 방법은 간단하다. 명시적으로 형변환을 시켜주면 된다.(void 포인터가 어떠한 자료형도될 수 있기 때문에 가능하다) int면 int로 형변환을 시켜주면 된다. 다음은 사용 예이다.
char* str = (char*)malloc(sizeof(char) * 10);
str = "ABCDEFGHI";
char c = str[1];

위를 컴파일 해서 실행해보면..
1.문자하나를 담을 수 잇는 메모리가 연속으로 10칸 생기고.. 주 시작 주소를 문자형 포인터 변수 str에 넘겨주고.
2.1번에 의해 str은 10칸의 문자형 배열의 시작 주소를 가지며
3.str이 가리키는 곳부터 시자갛여 "ABCDEFGHI"를 입력하고.. 마지막 바이트에는 \0(NULL 문자)이 들어가고
4.그중 두번째 값을 문자형 변수 c에 넣게 된다.

여기서 중요한 것은 char이 1바이트이고, 영문자(알파벳)도 1바이트이나 한글은 2바이트라서.. 위 배열에 영문자는 9글자가 들어갈 수 있으나 한글은 그렇지 않을 수 있다는 것이다.

그리고 malloc과 비슷하나.. 배열친화적인 기능을 하는 함수가 있다.
그 함수는 calloc함수로 원형은 이렇다.
void* calloc(size_t num, size_t size);
첫번째 파라미터는 메모리의 갯수가 들어가고 두번째 파라미터는 메모리의 크기가 들어간다.
즉 calloc(3,sizeof(int)); 하면 int형의 크기인 2바이트 짜리 메모리가 3개 생성된다. 뿐만 아니라 calloc함수는 셍성된 모든 메모리를 0으로 초기화시키고 그 시작 주소를 넘겨준다. 따라서 calloc(3, sizeof(int)); 하면 2바이트 메모리를 3개 생성한후 0으로 초기화 시키고 그 시작주소를 넘겨주게 된다.
malloc에 나온 예제를 calloc으로 고치면 아래와 같아진다.
char* str = (char*)calloc(10,sizeof(int));
str = "ABCDEFGHI";
char c = str[1];

마지막으로 realloc 함수가 있는데 이 함수는 이럴때 쓴다... 배열을 사용하다가보면 배열내 메모리가 부족하거나 남아도는 경우가 있다... 이럴때 realloc함수를 이용하여 크기를 재 설정할 수 있다 이 함수의 원형은 아래와 같다.
void* realloc(void* memory, size_t size);
첫번째 파라미터에 크기를 조정할 메모리의 주소(포인터)를 넣고, 두번째 파라미터에 조정할 크기를 적는다.
str = (char*)realloc(str,20); 이라고 하면 기존 str 배열의 메모리 갯수가 10개에서 20개로 늘어난다. realloc 사용시 주의 할 점은.. 크기를 늘릴때는 기존에 있던 데이터들을 그대로 유지한채 늘어나지만.. 줄일때는 줄어든 부분만큼은 소실되기 때문에.. 조심해야 할것이다.

마지막으로.. 배열이 메모리가남거나 부족하다고 malloc함수나 calloc 함수를 사용하여 재 할당 하면 기존의 메모리는 미아가 되 어떠한 방법으로도 접근할 수 없게 되 쓰레기가 되므로 (나중에 이게 쌓이면 메모리 부족현상이 나타난다) 재할당하지말고 realloc함수를 이용하여 크기를 조정하도록 하자..



--------------------------------------------------------------------------------------------------------------------

malloc, calloc을 동적메모리 할당을 위해 쓴다고들 하셨는데
중요한 것은 굳이 정적메모리 할당을 받아도 되는데 왜 동적할당을 받아야 하는 것인가
그리고 이 함수들이 많은 문제점들이 있는데(윗분 말처럼 메모리 누수 등) 그럼에도 불구하고
왜 사용하게 되는가 이것이 중요한 포인트이거든요...

자 PC를 예를들어 봅시다.
여러가지 프로그래은 PC의 메인메모리(DRAM)에서 돌아갑니다.
만약 PC의 메인메모리에서 응용프로그램이 자유롭게 쓸수있는 메모리 공간을 1MB라고 합시다.
그리고 3개의 프로그램이 있는데 각각 프로그램이 돌면서 변수나 버퍼등을 위하여
1번은 500KB, 2번은 300KB, 3번은 400KB 정도의 DRAM 메모리를 필요한다고 합시다.

이런 프로그램이 한번에 하나씩만 램에 올라가서 수행되면 문제는 없는데
PC 윈도우즈는 기본적으로 멀티프로세싱 개념으로서 여러개의 프로그램이 동시에 돌 수가 있습니다.
그러므로 제한된 1MB 메모리에서 3개의 프로그램이 동시에 돌고 있다면 모두 자기가 필요한
메모리 만큼이 있어야 하므로 500+300+400 = 1.2MB 가 필요합니다.
즉, 3개 프로그램이 동시에 돌기가 불가능한거지요
그럼 어떻게 할까요? 하나의 프로그램은 수행 포기하고 두개만 돌리고 나중에 다른 하나를 구동할까요?

그래서 나온 개념이 동적할당입니다. 즉, 한정된 메모리를 효율적으로 사용하기 위한 방식이지요...
즉, 1MB를 공용공간으로 설정하고 응용프로그램들은 메모리 사용이 필요할 때 이 공용공간에서 필요한 만큼
메모리를 배정(할당) 받아서 사용하고 다 사용하면 이를 다시 반환(free)하는 겁니다
즉, 프로그램들이 이들 메모리 영역을 항상 사용하고 있는 것이 아니므로
평소에는 메모리를 안쓰다가 필요할 때 원하는 크기로 메모리 할당(혼자만 쓸수 있는 자격을 부여받는 거지요)
을 받고 사용후에 다시 free 하여 다른 프로그램이 사용할 수 있도록 하는 거지요...

그런데 아무리 필요할 때 그냥 사용하는 메모리라고 하더라도 관리는 필요하지요
그래서 이들을 담당하는 함수가 malloc, calloc 입니다.
물론 malloc은 메모리를 주되 그냥 쓰레기 값인 상태로 주는것이고
calloc은 메모리 영역을 0으로 clear 해서 주는 것입니다.
그리고 사용끝난 메모리를 다시 반환할때 사용하는 함수가 free 입니다.

결론적으로
malloc, calloc 은 동적메모리 공간(HEAP)에 원하는 메모리 크기로 동적할다을 받는것을 의미하고
동적메모리(HEAP)은 여러프로그램들이 제한된 메모리를 서로 효율적으로 사이좋게
공유하면서 사용하기 위한 방법입니다.