본문 바로가기

컴퓨터/언어,프로그래밍

[C/C++] malloc, calloc, realloc를 이용한 메모리 할당

malloc와 calloc의 함수 원형은 다음과 같다.

void *malloc(size_t size);
void *calloc(size_t num, size_t size);


malloc는 할당할 메모리 크기를 바이트 단위로 전달받고, 할당된 공간의 값들은 바꾸지 않는다.
calloc는 메모리 크기를 두 값으로 나누어 전달받으며, 할당된 공간의 값을 모두 0으로 바꾼다.
그래서 배열을 할당하고 모두 0으로 초기화해야 할 때는 calloc를 쓰면 편하다.

아래 세 문장은 int형 변수를 배열처럼 5개씩 할당하는 예이다.

n = (int *)malloc( 5 * sizeof(int) );
n = (int *)calloc( 5, sizeof(int) );
n = (int *)calloc( 1, 5*sizeof(int) );


여기서 'sizeof(int)'는 int형 변수가 차지하는 메모리 크기를 바이트 단위를 반환해 준다.
메모리 공간을 할당하는 점은 위 세 문장이 모두 같고, calloc가 할당된 공간의 값들을 0으로 채운다는 점이 다르다.
둘째, 셋째 문장은 수행 결과가 똑같다.


이미 할당한 공간의 크기를 바꿀 때에는 realloc를 쓴다.

void *realloc(void *memblock, size_t size);

realloc는 재할당한 뒤에 새로 할당된 메모리 주소를 반환한다.
기존에 있던 배열의 자료는 그대로 유지하면서 배열 길이를 늘릴 수 있다.
다음은 malloc로 배열크기를 5으로 할당하여 숫자를 채우고, realloc로 배열 크기를 10로 늘려서 숫자를 추가하는 예제이다.



#include <stdio.h>
#include <stdlib.h>

void main()
{

  int *ar, size, i;
   
  size = 5;
  ar = (int *)malloc(size*sizeof(int));
  for(i=0; i<size; ++i) ar[i]=i;
  for(i=0; i<size; ++i) printf("%d",ar[i]);
  printf("\n");

  size = 10;
  ar = (int *)realloc(ar, size*sizeof(int));
  for(i=5; i<size; ++i) ar[i]=i;
  for(i=0; i<size;++i) printf("%d",i);
  printf("\n");
 
  free(ar);

}



이 예제를 실행시키면 이렇게 출력된다.

01234
0123456789

출처 : http://idd.kr/blog/pbs/109

제주삼다수, 2L,... 오뚜기 진라면 매운... 상하목장 유기농 흰... 남양 프렌치카페 카... 고려인삼유통 홍삼 ... 종근당건강 오메가3... 요이치 카링 유무선...