[C언어] malloc, calloc, realloc를 이용한 유동 메모리 할당
무른연모/C, C++
2009/01/22 10:11
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
덧글을 달아 주세요
첵 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 쪽 구절의 출력문은 같아야 하는데, 작지만 큰 실수를 했네요.
이미 보신 분들께도 잘못된 예제를 올려 두어서 죄송합니다.