malloc calloc realloc
제목에 있는 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함수를 이용하여 크기를 조정하도록 하자..