
CSAPP 책은 쌩으로 읽는다면 이해하기 매우 어렵습니다.
따라서 소단원만 그대로 따라가되, 내용을 이해하기 쉽게 재구성했습니다.
C는 정적 언어이기 때문에, 배열의 크기를 보통 컴파일 타임에 고정한다.
하지만 모든 상황에서 이게 통하지는 않는다.
예로, n개의 정수를 입력받아서 배열에 저장하는 프로그램을 작성해야 한다고 가정해보자.
이때 정적 메모리를 사용하는 방식은 다음과 같다.
#include "csapp.h"
#define MAXN 15213
int array[MAXN];
int main()
{
int i, n;
scanf("%d", &n);
if (n > MAXN)
app_error("Input file too big");
for (i = 0; i < n; i++)
scanf("%d", &array[i]);
exit(0);
}
이 할당 방식은 가장 간단한 방식으로 배열 크기를 제한하는 예시이다.
MAXN라는 배열의 크기를 임의로 설정해서, 만약 입력받은 n이 MAXN보다 크다면, 에러 메시지를 호출하고 종료한다.
그러나 이 정적 할당 방식에는 큰 문제가 있다.
MAXN의 값은 실제로 사용할 수 있는 가상메모리의 크기와 무관한 값이기 때문에, 사용자가 더 큰 입력값을 준다면 프로그램을 다시 컴파일해야 하는 문제가 발생한다.
작은 프로젝트에서는 괜찮지만, 수백만 줄의 대형 프로젝트나 상용 소프트웨어에서는 심각한 유지보수 문제로 이어질 수 있다.
보다 유연하고 효율적인 방법은 프로그램 실행 도중, n 값을 안 다음에 그 크기만큼 배열을 동적으로 생성하는 것이다.
#include "csapp.h"
int main()
{
int *array, i, n;
scanf("%d", &n);
array = (int *)Malloc(n * sizeof(int));
for (i = 0; i < n; i++)
scanf("%d", &array[i]);
free(array);
exit(0);
}
n이 입력된 이후에 malloc()을 사용해 배열을 생성하고, 사용 후에는 free()를 호출해 메모리를 반환한다.
이 동적 메모리 할당 방식은 배열의 크기가 프로그램 실행 중 결정되므로 불필요한 낭비 없이 정확한 메모리 할당이 가능하다.
또한 입력 크기만큼만 메모리를 쓰기 때문에 효율적이고, 사용 가능한 가상 메모리 한도 내에서만 메모리를 사용하므로 안정적이다.