문제 상황
동적 메모리 할당(dynamic memory allocation) 함수를 사용하여 배열 요소를 입력받고, 저장된 요소들의 합계를 계산한 뒤 화면에 출력하는 C 프로그램을 작성해 보겠습니다.
malloc 함수란?
C 언어에서 malloc(memory allocation)은 표준 라이브러리 함수로, 프로그램 실행 중(런타임)에 필요한 만큼의 메모리를 바이트 단위로 할당하는 역할을 합니다.
malloc 함수는 다음과 같은 특징을 가집니다.
- 할당된 메모리 블록의 시작 주소(기본 주소)를 가리키는 void 포인터를 반환합니다.
- 할당된 메모리를 초기화하지 않고 그대로 반환하므로, 내부에는 쓰레기 값(garbage value)이 남아 있을 수 있습니다.
- 요청한 크기의 메모리를 확보하지 못하면 NULL을 반환합니다.
함수 구문
void *malloc(size in bytes)
사용 예시
정수형 포인터 선언 후 1000바이트 할당하기
int *ptr;
ptr = (int *) malloc(1000);n개의 int 크기만큼 할당하기 (권장 방식)
int *ptr;
ptr = (int *) malloc(n * sizeof(int));
참고: 메모리가 부족하여 할당에 실패하면 NULL이 반환되므로, 반드시 반환값을 확인하는 것이 좋습니다.
전체 예제 코드
다음 예제는 사용자로부터 요소 개수를 입력받아 malloc으로 메모리를 동적으로 할당하고, 각 요소를 입력받아 합계를 구한 후, free()로 메모리를 해제했을 때 어떤 일이 일어나는지 보여줍니다.
#include<stdio.h>
#include<stdlib.h>
void main(){
// 변수와 포인터, 합계(sum) 선언 //
int numofe, i, sum = 0;
int *p;
// 사용자로부터 요소 개수 입력받기 //
printf("Enter the number of elements : ");
scanf("%d", &numofe);
// malloc() 함수 호출 - 필요한 만큼 메모리 동적 할당 //
p = (int *)malloc(numofe * sizeof(int));
/* 메모리 할당이 성공적으로 이루어졌는지
반드시 if문으로 검사해야 한다 */
if (p == NULL){
printf("Memory not available");
exit(0);
}
// 요소 입력 및 합계 계산 //
printf("Enter the elements : \n");
for(i = 0; i < numofe; i++){
scanf("%d", p + i);
sum = sum + *(p + i);
}
printf("\nThe sum of elements is %d", sum);
// free()로 메모리 해제 //
free(p);
// 해제된 메모리 영역 출력 - 쓰레기 값이 표시됨 //
printf("\nDisplaying the cleared out memory location : \n");
for(i = 0; i < numofe; i++){
printf("%d\n", p[i]); // 쓰레기 값(garbage values)이 출력됨 //
}
}실행 결과
Enter the number of elements : 5 Enter the elements : 23 45 65 12 23 The sum of elements is 168 Displaying the cleared out memory location : 10753152 0 10748240 0 23
핵심 포인트 정리
- malloc(n * sizeof(int)): 자료형 크기를 곱해주는 방식이 이식성 측면에서 안전하며 권장됩니다.
- NULL 검사 필수: 메모리 할당 실패 가능성을 항상 염두에 두고 반환값을 확인해야 합니다.
- free() 호출 후 주의: 메모리를 해제한 뒤 해당 공간에 접근하면 예측 불가능한 쓰레기 값이 출력되며, 이는 미정의 동작(undefined behavior)에 해당하므로 실제 코드에서는 피해야 합니다.
- 메모리 누수 방지: 동적으로 할당한 메모리는 사용이 끝나면 반드시 free()로 해제하는 습관을 들여야 합니다.