heap영역에 메모리를 할당하는 함수로, malloc 함수와 같은 기능을 한다.
void * calloc(size_t elt_count, size_t elt_size);
-> 성공 시 할당된 메모리의 주소값, 실패 시 NULL 반환
int ptr1 = (int*) malloc(sizeof(int)*5);
-> 총 20byte를 heap영역에 할당해라
int ptr2 = (int*)calloc(5, sizeof(int));
-> 4byte 크기의 메모리 5개를 heap영역에 할당해라(총 20byte)
위에서 볼 수 있듯이, calloc 함수와 malloc 함수의 차이점은 메모리 공간 할당을 위한 전달 방식에 있다.
malloc 함수 : 한번에 할당할 바이트의 크기를 한번에 전달
calloc 함수 : 첫 번째 전달인자로는 할당할 메모리 블록의 개수 전달. 두 번째 전달인자로는 블록 하나당 바이트의 크기 전달
그리고, 또 하나의 차이점이 있다. malloc 함수는 heap영역에 할당된 공간을 별도의 값으로 초기화 하지 않는다. 그렇기 때문에 할당된 메모리 공간은 쓰레기 값으로 채워진다.
하지만 calloc함수는 할당된 메모리 공간을 모두 0으로 초기화 한다. 그러므로, 배열을 할당하고, 모두 0으로 초기화할 필요가 있을 경우, calloc을 사용하면 편하다.
malloc 함수 : 할당된 메모리공간 별도의 값으로 초기화 X. 쓰레기 값으로 채워짐.
calloc 함수 : 할당된 메모리 공간을 모두 0으로 초기화.
heap영역에 할당된 (malloc,calloc 함수 사용) 메모리 공간의 크기를 확장하거나 줄이는 기능을 한다.
(일반적인 경우, 어느 영역이든간에 한 번 할당된 메모리 공간의 크기는 확장할 수 없다. 하지만, 위와 같이 해당영역이 heap이고, realloc 함수를 사용한다면 가능하다.)
// realloc 함수의 기본형
void * realloc(void *ptr1, size_t size);
-> 성공 시, 새로 할당된 메모리의 주소값, 실패 시 NULL 변환.
" ptr1이 가리키는 메모리 공간의 크기를 size만큼 늘린다. "
int main(void)
{
int * ptr1 = (int*)malloc(sizeof(int)*3); // heap 영역에 12byte 크기의 int형 배열(메모리 공간) 할당.
... // 1) 또 다른 동적할당이 일어날 수 있음.
ptr1 = (int*)realloc(ptr1, sizeof(int)*5); // 기존 malloc 함수에 의해 할당된 12byte 메모리 공간(포인터 변수 ptr1이 가리키고 있는)을 20byte로 확장.
...
}
위 코드의 malloc함수 부분과 realloc함수 부분 중간에 또 다른 메모리 동적할당이 일어났다고 가정해보자.
그럼, heap영역에 이미 할당되어 있는 12byte 메모리 공간에 이어서 새로운 메모리 공간이 할당된다.
1
2
b
y
t
e
?
?
?
?
<- 이런식으로. (? 는 새로 동적할당된 메모리 공간)
이 상태에서 realloc 함수를 호출해 버리면 옆에 새롭게 할당된 메모리 공간을 덮어써서 확장할 수도 없고, 난감해진다.
이런 경우 realloc함수는 확장하고자 한 공간 20byte만큼을 새롭게 별도로 할당한다. 그리고, 기존 12byte를 그 메모리 공간(20byte)에 복사하여 넣는다.
결국 새로 할당한 20byte공간 안에 기존 12byte공간을 복사하여 넣었기 때문에, 처음 malloc 함수가 ptr1에 반환하는 주소값과 realloc 함수가 ptr1에 반환하는 주소값은 달라지게 된다.