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",ar[i]);
//for(i=0; i<size; ++i) printf("%d",i);
printf("\n");

free(ar); // 할당한 메모리 해제
}



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

01234
0123456789

2009/01/22 10:11 2009/01/22 10:11
얽힌 글타래
<셈틀말> 글갈래의 다른 글
글 걸기 주소 : 이 글에 다른 글을 걸 수 없습니다

덧글을 달아 주세요

  1. 2016/03/08 11:52 고유주소 고치기 답하기

    안녕하세요

    다름이 아니라 예문에서 realloc 을 한다음 크기를 보기 위하여 printf하는구문에서

    for(i=0; i<size; ++i) printf("%d",i);--->for(i=0; i<size; ++i) printf("%d",ar[i]);

    로 바꾸어야 하는것은 아닌지요. 앞에 구문으로 보면 그저 i의 반복문을 프린트 하는것 같아서 문의드립니다.

    • 팥알 2016/03/08 12:54 고유주소 고치기 답하기

      중요한 걸 짚어 주셔서 고맙습니다.
      malloc 쪽 구절과 realloc 쪽 구절의 출력문은 같아야 하는데, 작지만 큰 실수를 했네요.
      이미 보신 분들께도 잘못된 예제를 올려 두어서 죄송합니다.