안녕하세요 리습입니다.
이번 시간엔 이미 할당된 메모리 공간에 대해서 크기를 바꾸는 방법 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함수를 사용하는 방법입니다. 이에 대한 사용법을 잘 기억하셔서 편리하시게 사용하시기 바랍니다.
'소프트웨어 > C 언어' 카테고리의 다른 글
[C언어] 38. 이차원 배열의 동적 할당 (2차원 배열의 동적 할당) (1) | 2021.04.08 |
---|---|
[C언어]36.C 동적할당 malloc 말고 초기화와 함께 하는법 : calloc (0) | 2021.03.16 |
[C언어]35.포인터의 첫번째 응용 동적할당 -2- (동적할당 하는 법, malloc, free) (0) | 2021.03.14 |
[C언어]34.포인터의 첫번째 응용 동적할당 -1- (동적할당이란) (2) | 2018.10.15 |