ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [자료구조] 배열의 크기 조정
    Stage/Computer Science 2021. 6. 1. 23:23

    학습 목표

    배열의 크기를 조정하는 코드를 작성할 수 있다.

    1. 배열의 크기 조정

    배열의 크기를 키우려면 어떻게 해야 할지 생각해보자.

     

    배열의 크기가 3이고, 이 크기를 4로 하고 싶다면 단순히 생각하면 크기가 3인 배열 바로 옆에 한 바이트의 공간만 더 붙이면 된다.
    실제로도 이런 방식으로 배열의 크기를 조정할 수 있을까?

     

    실제로는 키우려는 배열 메모리 주위에는 다른 메모리들로 둘러 쌓여있을 확률이 높다.
    기존에 사용하고 있던 메모리 뒤에는 다른 데이터들이 담겨 있을 수 있는데 이 상태에서 데이터를 메모리를 새로 할당하지 않고 메모리 크기를 키운다면 뒤에 있던 메모리에 데이터를 덮어쓰는 일이 발생할 수 있다.

     

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

     

    이런 작업은 배열의 크기 n 만큼 실행 시간이 걸리므로 시간 복잡도는 O(n)이다.



    2. 새로운 메모리 할당

    2.1 새로운 공간 만들기

    #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;
    
        int *tmp = malloc(4 * sizeof(int));
    
        if (tmp == NULL)
        {
            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);
    }
    • 코드를 읽어보면 다 이해가 가는데, free(list); 메모리 해제하는 부분이 아직 헷갈린다. 메모리 공간에서 포인터를 없애는 건지, 할당된 공간 자체를 없애버리는 건지?
    • tmp는 왜 해제를 안하는 거지??

    !! 해결되면 어떻게 이해했는지 과정 적고 삭제.



    2.2 realloc

    realloc 함수는 malloc을 통해 할당된 메모리의 크기를 축소하거나 확장하고 싶을 때 사용한다.

    #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 = tmp;
    
        // 새로운 list의 네 번째 값 저장
        list[3] = 4;
    
        // list의 값 확인
        for (int i = 0; i < 4; i++)
        {
            printf("%i\n", list[i]);
        }
    
        //list 의 메모리 초기화
        free(list);
    }
    • realloc을 사용하니까 list의 값을 tmp로 복사하는 코드를 안적어도 된다.
    void* realloc(void* ptr, size_t size);
    • realloc은 ptr이 가리키는 메모리 주소의 크기를 size 바이트로 확장 또는 축소한다.


    댓글