알고리즘 & 자료구조

[Data Structure] 배열의 크기 조정하기

인디아나쥰이 2021. 1. 24. 16:03

소스 코드를 보기전에 먼저 생각해보자

우리가 이미 일정한 크기의 배열을 선언 했다면, 

그 크기를 키우려면 어떻게 해야할까?

 

list[0] = 1;

list[1 = 2;

list[2] = 3;

 

밑에 표를 메모리라 생각해보자

list[3] 에 4를 저장하고 싶지만  h라는 값이 메모리에 담겨있다.

e m m a
1 2 3 h
e l l o

 단순히 메모리의 위치 바로옆에 일정 크기의 메모리를 덧붙일수 없다.

따라서 안전하게 새로운 공간에 큰 크기의 메모리를 다시 할당하고 기존 배열의 값들을 하나씩 옮겨줘야 한다.

 

이러한 작업은 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(list == NULL)
    {
        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("%d\n", list[i]);
    }

    free(list);
    */


	
   //2	번째 방법 'realloc'사용 하면 좀더 깔끔하게 작성 가능
   int *list = malloc(3*sizeof(int));
   if(list == NULL)
   {
       return 1;
   }

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

   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("%d\n", list[i]);
    }

    free(list);

}

 

728x90
반응형