이 영역을 누르면 첫 페이지로 이동
Daily Growth 블로그의 첫 페이지로 이동

Daily Growth

페이지 맨 위로 올라가기

Daily Growth

Loving you is the reason I live. That’s why every day is precious, a step toward my dreams and you.

동적 배열 크기 변경: malloc과 realloc로 메모리 할당하기

  • 2025.04.13 05:32
  • IT

배열 크기 늘리기 – malloc, realloc 공부기록 🧠

배열은 한 번 크기를 정하면 끝이다.
처음에 int arr[3]; 이렇게 선언하면,
3칸짜리 사물함이 딱 정해지는 거다.

문제는...
프로그래밍을 하다 보면 처음에 3칸이면 될 줄 알았는데,
중간에 4칸, 10칸, 100칸 필요해지는 경우가 너무 많다.

이럴 땐 어떻게 해야 할까?
이미 크기가 정해진 배열의 공간은 늘릴 수 없다.
그럼 진짜 늘리고 싶을 땐?

→ 동적 메모리 할당을 써야 한다.

 

goals

  • 동적 배열의 크기를 바꾸는 코드를 써본다
  • malloc + realloc이 뭘 해주는지 직접 확인한다
  • 진짜로 배열이 "늘어났다"는 게 무슨 의미인지 체감해본다

 

처음엔 malloc + 복사로 처리

처음엔 그냥 배열처럼 선언하고 쓰다가,
더 큰 배열이 필요해질 때는 새로운 공간을 만들고 옮기는 수밖에 없다.

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

int main(void)
{
    // 3칸짜리 배열 만들기
    int *list = malloc(3 * sizeof(int));
    if (list == NULL)
        return 1;

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

    // 4칸짜리 배열 새로 만들기
    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);
}

여기서 tmp는 일종의 임시 공간이다.
새로 만든 배열 공간에 기존 데이터 복사하고, 거기로 갈아탄다.

but, realloc이 훨씬 편함

이걸 아래처럼 realloc으로 줄일 수 있다.
realloc은 말 그대로 "할당 다시 하기" — Re-Alloc!

#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 = 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);
}

여기서 핵심은, realloc은 내부적으로
"지금 있는 공간에 더 붙일 수 있으면 붙이고, 안 되면 새 공간 만들어서 옮긴다"를 자동으로 처리해줌.

→ 사실상 malloc + 복사 + free가 합쳐진 거라고 보면 된다.


Q&A 🧐

1. tmp는 왜 필요한 거지?

처음엔 list = realloc(list, ...) 이렇게 바로 바꿔도 되지 않나 생각했는데,
실제로 realloc이 실패하면 NULL을 반환한다.
그럴 경우 기존 list는 그대로 유지되기 때문에,
그걸 임시 포인터 tmp로 받았다가, 성공했을 때만 list = tmp; 하는 게 안전한 방식.

2. for (int i = 0; i < 3; i++) 왜 3까지만 복사하지?

원래 있던 배열이 3칸짜리였기 때문.
malloc(3 * sizeof(int))으로 할당한 배열엔 index 0, 1, 2까지 세 값만 들어 있다.
그래서 복사도 그만큼만 해야 함.
(만약 배열 크기를 바꿔서 10으로 늘린다면 i < 10이 아니라 i < 기존배열크기로 써야 함!)


이번에 느낀 건 배열을 유연하게 다루려면 결국 malloc, realloc 같은 동적 메모리 함수를 잘 써야 한다는 것!

그리고 단순히 배열 크기 늘리기 = realloc 쓰면 됨
이라고만 생각하면 놓치는 개념이 너무 많다.

  • 왜 새로 공간을 만들어야 하는지
  • 왜 복사해야 하는지
  • 왜 realloc 실패 대비해야 하는지

이런 것들을 한번이라도 코딩하면서 "아 이렇게 되는구나" 느끼는 게 중요했다(:

다음엔 realloc을 더 활용해서 사용자 입력 받으면서 자동으로 배열 크기 늘려보기 같은 실습도 해보면 재미있을 것 같다🩵.

반응형

'IT' 카테고리의 다른 글

C언어 연결 리스트 실습: node 구조체와 포인터 이해하기  (0) 2025.04.13
연결 리스트란? 배열의 한계를 넘는 자료구조 입문 정리  (0) 2025.04.13
포인터와 malloc 함수 이해하기  (0) 2025.04.09
C 언어로 JPEG 파일 판별하기 - 파일 시그니처를 읽는 법  (0) 2025.04.08
인스타그램 바이럴 마케팅 하는 방법 (2025)  (0) 2025.04.03

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • C언어 연결 리스트 실습: node 구조체와 포인터 이해하기

    C언어 연결 리스트 실습: node 구조체와 포인터 이해하기

    2025.04.13
  • 연결 리스트란? 배열의 한계를 넘는 자료구조 입문 정리

    연결 리스트란? 배열의 한계를 넘는 자료구조 입문 정리

    2025.04.13
  • 포인터와 malloc 함수 이해하기

    포인터와 malloc 함수 이해하기

    2025.04.09
  • C 언어로 JPEG 파일 판별하기 - 파일 시그니처를 읽는 법

    C 언어로 JPEG 파일 판별하기 - 파일 시그니처를 읽는 법

    2025.04.08
다른 글 더 둘러보기

정보

Daily Growth 블로그의 첫 페이지로 이동

Daily Growth

  • Daily Growth의 첫 페이지로 이동

검색

메뉴

    카테고리

    • 분류 전체보기 (445) N
      • Design History (69)
      • IT (146) N
      • Typography (13)
      • UX • UI Design (10)
      • Money (62)
      • Health (53)
      • Words (6)
      • Reading (21)
      • English (64)

    나의 외부 링크

    • lody.design
    • lody.canada
    • lody.study
    • lody.diary

    정보

    self-improvement의 Daily Growth

    Daily Growth

    self-improvement

    블로그 구독하기

    • 구독하기
    • 네이버 이웃 맺기
    • RSS 피드

    방문자

    • 전체 방문자
    • 오늘
    • 어제

    티스토리

    • 티스토리 홈
    • 이 블로그 관리하기
    • 글쓰기
    Powered by Tistory / Kakao. Copyright © self-improvement.

    티스토리툴바