cs50 5주차 강의를 듣는 중 동적 할당에서 메모리 늘리는 법에 관한 것이 이해가 안가서 찾아보았다.
먼저 3개의 정수 크기로 동적 할당을 한다.
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
//동적할당을 이용하여 3개 정수 메모리 확보 (int size는 4byte)
int *list = malloc(3 * sizeof(int));
// 컴퓨터 메모리 부족할 시 오류 반환
if(list == NULL)
{
return 1;
}
list[0] = 1;
list[1] = 2;
list[2] = 3;
}
이제 list에는 1 2 3 이라는 숫자가 들어가 있다.
여기서 4라는 숫자를 추가하고 싶다면
새롭게 정수 4개짜리 크기의 메모리를 만들고
list에 있던 1 2 3을 옮긴 후 뒤에 4를 넣어주면 된다.
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
//동적할당을 이용하여 3개 정수 메모리 확보 (int size는 4byte)
int *list = malloc(3 * sizeof(int));
if(list == NULL)
{
return 1;
}
list[0] = 1;
list[1] = 2;
list[2] = 3;
int *tmp = malloc(4 * sizeof(int))
if(tmp == NULL)
{
free(list);
return 1;
}
for (int i = 0; i < 3; i++)
{
tmp[i] = list[i];
}
tmp[3] = 4;
free(list);
list = tmp;
for (int i = 0; i < 4; i++)
{
printf("%i\n", list[i]);
}
free(list);
return 0;
}
새롭게 만들어낸 tmp는 정수 4개 크기
list에 있던 숫자를 tmp에 순서대로 옮긴 후
tmp의 네번 째의 tmp[3]에 4를 넣어준다.
문제는
tmp[3] = 4;
free(list);
list = tmp;
숫자를 대입한 후 예전 list의 동적할당을 풀어버리고 (free)
다시 list 에 tmp를 대입하는 코드이다.
이제 realloc 재할당은 void *realloc(void *memblock, size_t size)
원래 있던 메모리를 size 변경 후 다시 사용하는 것이다.
위 코드를 realloc를 사용하면
int *tmp = realloc(list, 4 * sizeof(int))
if(tmp == NULL)
{
free(list);
return 1;
}
for (int i = 0; i < 3; i++)
{
tmp[i] = list[i];
}
tmp[3] = 4;
//free(list); 이 부분이 사라진다
list = tmp;
list를 정수 4크기로 변경한 것이다.
realloc이 어떻게 사용되는지를 살펴보면 이해가 간다.
원래 있던 정수 3개의 list에서 정수 4개의 list로 변경하려면
1. list 끝 메모리가 비어있어 사용 가능할 때
메모리 위치를 변경하지 않고 메모리의 끝을 사용한다.
2. list 끝 메모리가 비어 있지않아 사용 불가능할 때
새로운 메모리를 만들어 값을 복사하여 사용한다.
이때 전에 사용하던 정수 3개짜리 메모리는 free처리한다.
메모리 위치가 변경된다.
강의에서 코드 가운데 free(list); 를 사용한 것도 realloc의 사용 방법을 보여준 것이라 생각된다.
'자료구조' 카테고리의 다른 글
| (c++) 비트마스크(bitmask) 정리 (1) | 2024.01.30 |
|---|---|
| 힙 구조, 우선순위 큐 (0) | 2024.01.07 |
| [C]스택의 이해 (0) | 2022.01.09 |
댓글