소프트웨어/C 언어

[C언어]37. C언어 할당된 동적할당 크기 바꾸는법! 재 할당 : realloc

리습 2021. 3. 17. 07:00

 

 

안녕하세요 리습입니다.

이번 시간엔 이미 할당된 메모리 공간에 대해서 크기를 바꾸는 방법 calloc을 소개하도록 하겠습니다.

메모리 재 할당이 필요한 이유

 프로그램이 동작하는 도중에 새로운 메모리 공간이 필요할 경우 우리는 동적 할당이라는 것을 하게 됩니다. 하지만 때로는 이미 할당된 메모리 공간 또한 부족해져서 추가적인 메모리 공간을 더 받아야 하는 경우가 생기죠. 이럴 때 사용하는 것이 바로 재 할당입니다.

 재 할당은 이미 할당된 영역의 데이터를 유지한 채로 할당의 크기를 늘려주기 때문에 매우 편리한 기능입니다. 마치 현재 할당받은 마지막 영역을 더 넓혀주는 역할을 해주게 되죠. 예를 들어 할당을 10개 받아 ptr[9]라는 변수까지 사용할 수 있었다면 이를 2배 더 할당받아 ptr [19] 까지 사용할 수 있게 되는 것입니다.

realloc 사용하는 법

 realloc의 선언은 다음과 같습니다.

#include <stdlib.h>

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

realloc은 stdlib.h안에 선언되어 있습니다. 함수 인자로는 이미 할당받은 메모리 주소와, 새로 할당받을 크기를 입력할 수 있습니다. 이때 size는 Byte단위로 입력받기 때문에 malloc과 동일하게 sizeof연산자와 함께 사용하는 것이 좋습니다. 또한 이 크기는 기존 할당받은 크기보다 줄일 수도 있습니다.

realloc 사용 예시는 다음과 같습니다.

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

int main(void) {
	int *ptr = NULL;
	ptr = (int*)malloc(10*sizeof(int)); // 필요한 숫자 입력
	/* processing example*/
	for (int i = 0; i < 10; i++) {
		ptr[i] = i;
	}
	/* procssing end */
	ptr = (int*)realloc(ptr, 20 * sizeof(int)); // 재 할당
	/* processing example*/
	for (int i = 10; i < 20; i++) {
		ptr[i] = i;
	}
	for (int i = 0; i < 20; i++) {
		printf("%d\n", ptr[i]);
	}
	/* procssing end */
	free(ptr);
	return 0;
}

 

realloc을 사용할 때 주의할 점

 다만 이렇게 영역이 넓혀진다고 해서 메모리 공간이 유지된 채로 넓어지는 것은 아닙니다. OS는 프로그램이 처음 할당받은 주소에서 추가적으로 요청한 메모리 공간을 확보할 수 없을 시, 다른 메모리 공간에 요청받은 메모리 공간을 만들어주고 ,현재 데이터를 복사한 뒤 새로운 메모리 주소를 프로그램으로 전달해 주게 됩니다. 예를들어 이를 그림으로 나타내면 다음과 같습니다. 

 

 

이미 할당된 메모리공간 뒤에 빈 공간이 있을 경우, OS는 추가 요청된 메모리 공간을 기존 메모리 공간 뒤에 함께 사용할 수 있도록 배치해 줍니다. 하지만 빈 공간이 없을 경우, OS는 그 할당 위치를 모두 옮기게 됩니다.

 

 

 따라서 realloc 함수를 사용할 때는, 항상 기존 메모리 공간의 위치가 옮겨질 수 있다는 것을 기억하고 사용해야만 합니다.

마무리

C언어도 다른 언어와 같이 할당된 메모리 공간을 편리하게 늘리거나 줄일 수 있는 기능이 있습니다. 바로 realloc함수를 사용하는 방법입니다. 이에 대한 사용법을 잘 기억하셔서 편리하시게 사용하시기 바랍니다.