본문 바로가기
cs/CS50

6: 자료구조-2(배열의 크기 조정하기)

by 이쟝 2021. 12. 11.

리스트에 1, 2, 3을 할당하는 코드 작성

 

include <stdio.h>

int main(void)
{
    int list[3];

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

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

 

- 일정한 크기의 배열이 주어졌을 때, 현재 배열이 저장되어 있는 메모리 위치의 옆에 일정 크기의 메모리를 더 덧붙이면 되겠지만, 실제로는 다른 데이터가 저장되어 있을 확률이 높음

- 그래서 안전하게 새로운 공간에 큰 크기의 메모리를 다시 할당하고 기존 배열의 값들을 하나씩 옮겨줘야 함(배열의 단점)

- malloc을 이용하면 정해진 숫자를 타이핑할 필요가 없어서 일정량의 메모리를 동적으로 할당할 수 있게 됨


크기가 3인 list를 할당하고 값을 저장한 뒤에 새로운 tmp 리스트를 할당하고 list에 있던 값을 tmp로 이동하고 tmp에 네 번째 값을 추가한 뒤 list 출력

 

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

int main(void)
{   //int 자료형 3개로 이루어진 list라는 포인터를 선언하고 메모리 할당
    int *list = malloc(3 * sizeof(int));

     // 포인터가 잘 선언되었는지 확인
     // list가 NULL이 되면 프로그램 종료!(return이 1이면 프로그램 종료)
    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)
    {
        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]);
    }
     free(list);
}

 

코드의 결과

- 위와 동일한 작업을 malloc이 아닌 realloc을 사용을 사용해서 조금 더 간단하게 표현할 수 있음

- realloc은 기존 배열에서 새로운 배열로 데이터를 복사해주는 데 이미 할당받은 기존 메모리 덩어리를 새롭게 가져오고 기존에 있던 것의 크기에 상관없이 새롭게 설정된 크기로 바꾸는 작업을 함


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 = tmp;

    // 새로운 tmp의 네 번째 값 저장
    tmp[3] = 4;

     // list의 값 확인
    for (int i = 0; i < 4; i++)
    {
        printf("%i\n", list[i]);
    }
    // list의 메모리 초기화
    free(list);
}

 

이 작업은 O(n), 즉 배열의 크기 n만큼의 실행 시간이 소요될 것(배열 전체를 새 공간에 복사하기 때문)

 

 

https://www.boostcourse.org/cs112/joinLectures/41307

 

모두를 위한 컴퓨터 과학 (CS50 2019)

부스트코스 무료 강의

www.boostcourse.org