다음 함수는 malloc 함수와 마찬가지로 메모리를 할당하되 필요한 메모리양을 지정하는 방법만 다르다.
void *calloc( size_t num, size_t size );
첫 번째 인수 num은 할당할 요소의 개수이고 size는 요소의 크기이다. malloc은 필요한 메모리를 바이트 단위 하나로만 전달받지만 calloc은 두 개의 값으로 나누어 전달받는다는 점이 다르다. malloc이 "몇 바이트 할당해 주세요"라고 요청하는 것에 비해 calloc은 "몇 바이트짜리 몇 개 할당해 주세요"라고 요청하는 것이다. 그래서 다음 두 호출문은 동일하다.
ar=(int *)malloc(10*sizeof(int));
ar=(int *)calloc(10,sizeof(int));
구조체같은 큰 데이터의 배열을 할당할 때는 calloc으로 할당하는 것이 더 보기에 좋고 코드를 읽기에도 좋다. calloc도 실제 할당하는 양은 size*num으로 계산하므로 사실 calloc(1,10*sizeof(int))나 calloc(10*sizeof(int),1)이나 결과는 동일하다. 다만 필요한 메모리양을 단위와 개수로 나누어 좀 더 논리적으로 표현한다는 점만 다르다.
calloc이 malloc과 다른 또 다른 차이점은 메모리 할당 후 전부 0으로 초기화한다는 것이다. malloc은 메모리 할당만 해 주므로 할당된 메모리에는 쓰레기값이 들어 있지만 calloc으로 할당하면 할당 후 모든 메모리를 0으로 채워준다. 할당 후에 배열을 바로 초기화해야 한다면 malloc 호출 후 memset을 사용할 수도 있지만 이 방법보다는 calloc 함수로 할당하는 것이 더 편리하다
다음 함수는 이미 할당된 메모리의 크기를 바꾸어 재할당한다. 최초 할당한 크기보다 더 큰 메모리가 필요할 때는 이 함수로 크기를 조정할 수 있다. 원래 크기보다 더 작게 축소 재할당하는 것도 가능하기는 하지만 보통은 확대 재할당하는 경우가 많다.
void *realloc( void *memblock, size_t size );
첫 번째 인수로 malloc이나 calloc으로 할당한 메모리의 시작 번지를 주고 두 번째 인수로 재할당할 크기를 전달하면 된다. 만약 첫 번째 인수가 NULL일 경우, 즉 할당되어 있지 않을 경우는 새로 메모리를 할당하므로 realloc의 동작은 malloc과 같아진다. 재할당 후에 새로 할당된 메모리의 번지를 리턴하는데 이 번지는 원래 번지와 같을 수도 있고 아닐 수도 있다. 일반적으로 축소 재할당했을 때는 같은 번지이며 확대 재할당했을 때는 다른 번지로 이동될 확률이 높다.
예를 들어 ar 배열이 20바이트만큼 할당되어 있는 상태에서 40바이트로 확대 재할당한다고 해 보자. 만약 ar뒤쪽의 메모리가 비어 있다면 ar을 40바이트로 늘리기만 하면 되므로 ar은 그자리에서 길이만 늘어난다. 그러나 ar다음의 메모리가 비어 있지 않다면 ar의 위치가 바뀌게 될 것이다.
#include
void main()
{
int *ar;
ar=(int *)malloc(5*sizeof(int));
ar[4]=1234;
ar=(int *)realloc(ar,10*sizeof(int));
ar[9]=5678;
printf("ar[4]=%d, ar[9]=%d\n",ar[4],ar[9]);
free(ar);
}
'Native > C' 카테고리의 다른 글
ArrayIndex ( []연산자 ) (0) | 2013.10.02 |
---|---|
main 함수의 인수 (0) | 2013.10.02 |
malloc 할당 및 해제 (0) | 2013.10.02 |
voidDump (0) | 2013.10.02 |
memset (0) | 2013.10.02 |