배열 할당하기
힙 메모리를 예약해 보세요.
배열 할당하기은(는) CoddyKit의 무료 C Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
동적 배열이 필요한 이유
일반 배열의 크기는 컴파일 시점에 고정됩니다. 하지만 프로그램이 실행될 때까지 필요한 요소의 개수를 알 수 없는 경우가 많습니다.
동적 배열은 이 문제를 해결합니다. malloc을 사용하여 실행 중에 운영 체제에 메모리 블록을 요청하고, 변수로 크기를 정합니다.
malloc 알아보기
malloc(메모리 할당)은 <stdlib.h>에 있습니다. 바이트 수를 전달하면 해당 블록을 가리키는 포인터를 반환하고, 실패하면 NULL을 반환합니다.
메모리는 힙에서 할당되며 해제할 때까지 유지됩니다.
int *p = malloc(10 * sizeof(int));sizeof로 크기 정하기
바이트 수를 절대로 하드코딩하지 마십시오. sizeof를 사용하면 플랫폼이 달라도 코드가 올바르게 작동합니다.
n개의 정수를 저장할 공간을 할당하려면 n에 sizeof(int)를 곱하십시오. 포인터 자체의 형식을 사용하는 n * sizeof(*p)도 흔히 쓰는 표현입니다.
int *p = malloc(n * sizeof(*p));항상 NULL을 확인하십시오
시스템에 메모리가 부족하면 malloc은 NULL을 반환합니다. NULL 포인터를 역참조하면 프로그램이 충돌합니다.
사용하기 전에 결과를 확인하십시오. 이 간단한 습관만으로도 원인을 찾기 어려운 오류를 많이 예방할 수 있습니다.
int *p = malloc(n * sizeof(*p));
if (p == NULL) {
fprintf(stderr, "out of memory\n");
return 1;
}완전한 할당 예제
다음은 정수 5개를 저장할 공간을 할당하고, 값을 채운 뒤 출력하는 전체 프로그램입니다.
대칭적인 구조에 주목하십시오. 시작할 때 malloc을 사용하고 끝날 때 free를 사용합니다.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int n = 5;
int *a = malloc(n * sizeof(*a));
if (!a) return 1;
for (int i = 0; i < n; i++) a[i] = i * i;
for (int i = 0; i < n; i++) printf("%d\n", a[i]);
free(a);
return 0;
}malloc은 0으로 초기화하지 않습니다
malloc으로 얻은 메모리는 초기화되지 않습니다. 이전에 그곳에 있던 임의의 값이 들어 있습니다.
쓰기 전에 읽으면 예측할 수 없는 값이 나옵니다. 읽기 전에 모든 요소에 항상 값을 대입하십시오.
int *a = malloc(3 * sizeof(*a));
/* a[0], a[1], a[2] hold garbage here */
a[0] = 10;calloc은 자동으로 0으로 초기화합니다
calloc(count, size)는 size바이트 크기의 요소를 count개 저장할 공간을 할당하고 모든 바이트를 0으로 설정합니다.
깨끗하게 0으로 채워진 배열이 필요할 때 사용하십시오. 곱셈에서 발생할 수 있는 오버플로도 방지합니다.
int *a = calloc(5, sizeof(*a));
/* every element is now 0 */calloc 사용 예
이 프로그램은 calloc을 사용하고, 배열의 값을 변경하기 전에 배열이 0으로 시작하는지 확인합니다.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int n = 4;
int *a = calloc(n, sizeof(*a));
if (!a) return 1;
for (int i = 0; i < n; i++) printf("%d\n", a[i]);
free(a);
return 0;
}블록 인덱싱
힙 블록을 가리키는 포인터는 배열 이름과 똑같이 동작합니다. 0부터 n-1까지의 모든 요소를 a[i]로 읽고 쓸 수 있습니다.
내부적으로 a[i]는 *(a + i)와 같습니다.
int *a = malloc(3 * sizeof(*a));
a[0] = 1;
*(a + 1) = 2; /* same as a[1] = 2 */
a[2] = 3;범위를 확인하십시오
n개의 요소를 할당했다면 유효한 인덱스는 0부터 n-1까지입니다. a[n]에 쓰는 것은 정의되지 않은 동작입니다.
C는 범위를 대신 확인해 주지 않으므로, 하나를 잘못 세는 오류가 메모리를 조용히 손상시킬 수 있습니다.
int *a = malloc(3 * sizeof(*a));
a[2] = 99; /* OK, last valid index */
/* a[3] = 0; BUG: out of bounds */실행 중 크기 읽기
진정한 장점은 크기를 입력, 파일 또는 계산 결과에서 가져올 수 있다는 것입니다. 같은 코드로 요소 2개든 200만 개든 할당할 수 있습니다.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int n = 6; /* could be scanf'd */
long *a = malloc(n * sizeof(*a));
if (!a) return 1;
long sum = 0;
for (int i = 0; i < n; i++) { a[i] = i + 1; sum += a[i]; }
printf("%ld\n", sum);
free(a);
return 0;
}빠른 확인
메모리 할당에 대한 이해도를 확인해 보십시오.
복습
malloc(n * sizeof(*p))으로 동적 배열을 할당하거나, calloc(n, sizeof(*p))으로 0으로 채워진 배열을 할당할 수 있습니다.
항상 NULL을 확인하고, malloc은 쓰레기 값을 남긴다는 점을 기억하십시오. 인덱스는 0부터 n-1까지 사용하고, 모든 할당에는 반드시 free를 대응시키십시오. 다음에는 데이터를 유지하면서 블록의 크기를 조정하는 방법을 배웁니다.
자주 묻는 질문
“배열 할당하기” 강의는 무료인가요?
네 — “배열 할당하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C Academy 강의 전체를 잠금 해제할 수 있습니다. C Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“배열 할당하기”에서 뭘 배우나요?
힙 메모리를 예약해 보세요. 브라우저에서 직접 실행하는 실습 코드로 C Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“배열 할당하기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.