[CS50] 자료구조 - 배열의 크기 조정하기CSE/CS 기초2024. 6. 18. 14:00
Table of Contents
일정한 크기의 배열이 주어졌을 때 그 크기를 키우려면 어떻게 해야 할까?
단순하게 현재 배열이 저장되어 있는 메모리 위치의 바로 옆에 일정 크기의 메모리를 더 덧붙이면 되겠지만 실제로는 다른 데이터가 저장되어 있을 확률이 높다.
따라서 안전하게 새로운 공간에 큰 크기의 메모리를 다시 할당하고 기존 배열의 값들을 하나씩 옮겨줘야 한다.
이런 작업은 O(n), 즉 배열의 크기 n만큼의 실행 시간이 소요될 것이다.
이 과정을 아래 코드와 같이 나타낼 수 있다.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
// int 자료형 3개로 이루어진 list라는 포인터를 선언하고 메모리 할당
int *list = malloc(3 * sizeof(int));
// 포인터가 잘 선언되었는지 확인
if (list == NULL)
{
return 1;
}
// list 배열의 각 인덱스에 값 저장
list[0] = 1;
list[1] = 2;
list[2] = 3;
// int 자료형 4개 크기의 tmp라는 포인터를 선언하고 메모리 할당
int *tmp = malloc(4 * sizeof(int));
if (tmp == NULL)
{
free(list); // 할당된 메모리 해제
return 1;
}
// list의 값을 tmp로 복사
for (int i = 0; i < 3; i++)
{
tmp[i] = list[i];
}
// tmp 배열의 네 번째 값도 저장
tmp[3] = 4;
// list의 메모리를 해제
free(list);
// list가 tmp와 같은 곳을 가리키도록 지정
list = tmp;
// 새로운 배열 list의 값 확인
for (int i = 0; i < 4; i++)
{
printf("%i\n", list[i]);
}
// list의 메모리 해제
free(list);
return 0;
}
위와 동일한 작업을 realloc
이라는 함수를 이용해서 수행할 수도 있다.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
// int 자료형 3개로 이루어진 list라는 포인터를 선언하고 메모리 할당
int *list = malloc(3 * sizeof(int));
if (list == NULL)
{
return 1;
}
// list 배열의 각 인덱스에 값 저장
list[0] = 1;
list[1] = 2;
list[2] = 3;
// realloc 함수를 사용하여 list의 크기를 4개의 int 자료형 크기로 재할당
int *tmp = realloc(list, 4 * sizeof(int));
if (tmp == NULL)
{
free(list); // 할당된 메모리 해제
return 1;
}
// list가 tmp와 같은 곳을 가리키도록 지정
list = tmp;
// 새로운 list의 네 번째 값 저장
list[3] = 4;
// list의 값 확인
for (int i = 0; i < 4; i++)
{
printf("%i\n", list[i]);
}
// list의 메모리 해제
free(list);
return 0;
}
realloc
함수는 기존 메모리 블록을 확장하거나 축소할 때 유용하게 사용할 수 있다. 새로운 메모리 블록을 할당하고 기존 메모리 블록의 내용을 새로운 블록으로 복사한 후 기존 블록을 해제한다.
위 코드에서는 list
포인터를 realloc
함수로 재할당해 크기를 확장하고 이를 tmp
에 저장한 뒤 다시 list
에 대입해서 확장된 메모리를 사용한다.
References
728x90
반응형
'CSE > CS 기초' 카테고리의 다른 글
[CS50] 자료구조 - 해시 테이블 (0) | 2024.06.18 |
---|---|
[CS50] 자료구조 - 연결 리스트 (0) | 2024.06.18 |
[CS50] 자료구조 - malloc과 포인터 복습 (0) | 2024.06.18 |
[CS50] 메모리 - 파일 쓰기 (0) | 2024.06.17 |
[CS50] 메모리 - 메모리 교환, 스택, 힙 (0) | 2024.06.17 |
@junyeokk :: 나무보다 숲을
컴퓨터 전공 관련, 프론트엔드 개발 지식들을 공유합니다. React, Javascript를 다룰 줄 알며 요즘에는 Typescript에도 관심이 생겨 공부하고 있습니다. 서로 소통하면서 프로젝트 하는 것을 즐기며 많은 대외활동으로 개발 능력과 소프트 스킬을 다듬어나가고 있습니다.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!