동적 배열 크기 변경: malloc과 realloc로 메모리 할당하기
배열 크기 늘리기 – 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 |
댓글
이 글 공유하기
다른 글
-
C언어 연결 리스트 실습: node 구조체와 포인터 이해하기
C언어 연결 리스트 실습: node 구조체와 포인터 이해하기
2025.04.13 -
연결 리스트란? 배열의 한계를 넘는 자료구조 입문 정리
연결 리스트란? 배열의 한계를 넘는 자료구조 입문 정리
2025.04.13 -
포인터와 malloc 함수 이해하기
포인터와 malloc 함수 이해하기
2025.04.09 -
C 언어로 JPEG 파일 판별하기 - 파일 시그니처를 읽는 법
C 언어로 JPEG 파일 판별하기 - 파일 시그니처를 읽는 법
2025.04.08
댓글을 사용할 수 없습니다.