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

TIL

컴퓨터 안의 메모리는 마치 사물함 같은 구조다.

우리가 사용하고자 하는 사물함의 개수를 한 번 정한 이후에는, 공간이 모자란다고 해서 주변의 사물함을 마음대로 더 사용할 수는 없다.

이미 다른 목적으로 사용되고 있을 수도 있기 때문이다.

 

이미 일정한 크기의 메모리가 할당되어 있는 상황에서 그 크기를 늘리는 일은 생각만큼 단순하지 않다.

포인터와 malloc의 개념을 응용해서 이미 정의된 배열의 크기를 바꿔보자.

배열의 크기 조정하기

배열 크기를 늘리는 방법

일정한 크기의 배열이 주어졌을 때, 그 크기를 키우려면 어떻게 해야 할까?

 

단순히 현재 배열이 저장되어 있는 메모리 위치의 바로 옆에 덧붙이면 될 것 같지만, 실제로는 다른 데이터가 저장되어 있을 확률이 높다.

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

이런 작업은 O(n), 즉 배열의 크기 n만큼의 실행 시간이 소요된다.

 

수동으로 크기 조정하기

#include 
#include 

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)
    {
        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);
}

 

동작 과정

1. [1][2][3]          ← 기존 list (크기 3)
2. [ ][ ][ ][ ]       ← 새로운 tmp (크기 4)
3. [1][2][3][ ]       ← 값 복사
4. [1][2][3][4]       ← 새 값 추가
5. list → [1][2][3][4] ← list가 tmp를 가리킴

 

realloc 함수 사용하기

위와 동일한 작업을 realloc 함수를 이용해 더 간단히 수행할 수 있다.

#include 
#include 

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의 장점

  • 메모리 할당과 복사를 한 번에 처리
  • 코드가 더 간결하고 읽기 쉬움
  • 경우에 따라 메모리를 재할당하지 않고 확장 가능

 

메모리 관리의 중요성

올바른 포인터 사용

잘못된 예

int *ptr;        // 초기화 안 됨
*ptr = 42;       // ❌ 위험!

 

올바른 예

int *ptr = malloc(sizeof(int));
if (ptr != NULL)
{
    *ptr = 42;   // ✅ 안전
    free(ptr);
}

 

배열 크기 조정 비교

방법 장점 단점
수동 할당 명확한 제어 코드가 김
realloc 간결함 내부 동작 숨겨짐

'TIL' 카테고리의 다른 글

생성자 함수  (0) 2025.11.09
[CS50] 자료구조 - 연결 리스트 개념과 구현  (0) 2025.11.09
React 컴포넌트 분리와 연동된 state 업데이트  (0) 2025.11.08
React 객체 state 관리와 useRef 활용하기  (0) 2025.11.08
React로 사용자 입력 관리하기  (0) 2025.11.08
'TIL' 카테고리의 다른 글
  • 생성자 함수
  • [CS50] 자료구조 - 연결 리스트 개념과 구현
  • React 컴포넌트 분리와 연동된 state 업데이트
  • React 객체 state 관리와 useRef 활용하기
고견
고견
개발 자국 남기기
  • 고견
    개발자국
    고견
  • 전체
    오늘
    어제
    • 분류 전체보기 (157) N
      • Frontend (29)
        • Next.js (16)
        • JavaScript (7)
      • CS (19) N
        • 자료구조 (9)
        • 알고리즘 (5)
        • 운영체제 (4) N
        • 네트워크 (1) N
      • TIL (93)
      • Dev Log (16)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    emotion diary
    generic
    바닐라 자바스크립트
    useState
    App Router
    자료구조
    javascript
    Spa
    타입 좁히기
    앱 라우터
    문자열
    클래스
    Next.js
    CS
    C
    알고리즘
    함수 타입
    배열
    cs50
    인터페이스
    페이지 라우터
    Trouble Shooting
    memory
    ai 감성 일기장
    react
    Pages Router
    제네릭
    algorithm
    typescript
    트러블 슈팅
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
고견
[CS50] 배열의 크기 조정하기
상단으로

티스토리툴바