CS 기초/자료구조

[CS50] 배열의 크기 조정하기

담크 2021. 8. 28. 23:42

컴퓨터의 메모리는 사물함 같은 구조를 가지고 있습니다. 예를 들어 학교에 30개의 사물함이 있다고 하면 전학생이 왔다고 해서 사물함의 개수를 더 늘리거나 30개보다 더 많이 사용할 수는 없습니다. 이 같이 이미 일정한 크기의 메모리가 할당되어 있는 상황에서 그 크기를 늘리기는 쉽지 않습니다. 오늘은 포인터와 malloc의 개념을 응용하여 이미 정의된 배열의 크기를 바꾸는 방법에 대해 공부해보도록 하겠습니다.

 

배열의 크기를 늘리기 가장 쉬운방법은 이미 배열이 저장된 메모리의 옆에 일정 크기의 메모리를 덧붙이면 되지만 실제로는 다른 데이터가 있을 수 있기 때문에 어렵습니다.

이렇게 아무것도 없어보여도
실제로는 이렇게 다른 데이터가 존재할 수 있습니다.

따라서 새로운 공간에 큰 배열을 저장할 수 있는 메모리를 다시 할당하고 기존 배열의 값을 하나씩 옮겨줘야합니다. 이러한 작업은 기존 배열이 3이라면 3개의 값을 옮겨줘야 하고, 기존 배열이 4라면 4개의 값을 옮겨줘야 하기 때문에 배열의 크기인 n에 따라 소요시간이 달라지게 되므로 O(n) 만큼의 실행시간이 소요될 것입니다.

아래는 이미 선언된 3크기의 list 배열을 4 크기의 배열로 바꿔주는 코드입니다.

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

int main(void)
{
	int *list = malloc(3 * sizeof(int));
    
    //포인터가 잘 선언이 안되었을경우 1 리턴
    if(list == NULL)
    {
    	return 1;
    }
    
    list[0] = 1;
    list[1] = 2;
    list[2] = 3;
    
    int *tmp = malloc(4 * sizeof(int));
    if(tmp == NULL)
    {
    	return 1;
    }
    
    //list의 값을 tmp로 복사해준다.
    for(int i = 0; i < 3; i++)
    {
    	tmp[i] = list[i];
    }
    //4인 배열이므로 값 하나 추가
    tmp[3] = 4;
    
    //list의 메모리를 초기화(여기 중요합니다)
    free(list);
    
    list = tmp;
    
    //여긴 배열의 길이를 알고있으니까 4로 적었는데 동적으로 해주는게 좋습니다.
    for(int i = 0; i < 4; i++)
    {
    	printf("%i\n", list[i]);
    }
    
    free(list);
}

결과값 출력

이렇게 malloc과 pointer의 개념을 사용해서 크기가 3인 배열을 4인 배열로 바꾸어 봤는데요 사실 위와 동일한 작업을 할 수 있는 함수도 있습니다. realloc이라는 함수입니다.

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

int main(void)
{
    int *list = malloc(3 * sizeof(int));
    if (list == NULL)
    {
        return 1;
    }

    list[0] = 1;
    list[1] = 2;
    list[2] = 3;

    // tmp 포인터에 메모리를 할당하고 list의 값 복사
    int *tmp = realloc(list, 4 * sizeof(int));
    if (tmp == NULL)
    {
        return 1;
    }

    list = tmp;

    list[3] = 4;

    for (int i = 0; i < 4; i++)
    {
        printf("%i\n", list[i]);
    }

    free(list);
}

결과는 동일하게 나옵니다.

 


출처

본 내용은 CS50의 2019년 강의를 듣고 작성했습니다. (개념이 어느 정도 정리되면 최신강의도 다시 듣고 수정할 내용 있으면 수정하겠습니다.)

 

강의 자료는 EdX에서 무료로 사용할 수 있고 boostcourse에서 한글 강의로도 들을 수 있습니다.

'CS 기초 > 자료구조' 카테고리의 다른 글

[CS50] 연결리스트 : 트리  (0) 2021.09.01
[CS50] 연결리스트 : 시연  (0) 2021.08.31
[CS50] 연결리스트 : 코딩  (0) 2021.08.30
[CS50] 연결리스트 : 도입  (0) 2021.08.29
[CS50] malloc과 포인터 복습  (0) 2021.08.27