동적 메모리 할당 및 해제
정적 메모리 할당의 한계
보통 프로세스 안에서 지역 변수가 저장되는 기본 스택(stack) 메모리 크기는 1Mbyte 이다.
따라서 함수를 호출할 때 지역 변수가 할당되는 메모리 공간은 최대 1Mbyte를 넘을 수 없다.
예를 들어 아래와 같이 배열을 선언하면 1Mbyte 가 할당되기 때문에 오류가 발생한다.

하지만 프로그램에서 사용하는 데이터는 당연히 1Mbyte 보다 훨씬 더 큰 경우가 많다.
예를 들어 우리가 보고 있는 스마트폰이나 모니터에 출력된 한 점(pixel)의 데이터가 보통 4바이트 크기이다.
이런 픽셀들의 모임인 full-hd 영상 한장을 저장하려면 1920 * 1080 * 4 바이트 , 대략 7Mbyte 정도의 크기가 필요하다.
결국 프로세스 안의 기본 스택으로 full - hd 영상 한장 조차 저장하지 못한다는 뜻이다.
동적 메모리 할당이란?
프로세스는 더 큰 메모리를 할당해서 사용할 수 있도록 힙이라는 공간을 제공한다.

스택은 '스택 프레임' 규칙을 통해 코드가 컴파일될 때 사용할 메모리 크기를 결정한다.
하지만 힙은 스택 프레임과 같은 형식이 적용되지 않으며 프로그래머가 원하는 시점에 원하는 크기만큼 메모리를 할당 할 수 있다.
그리고 메모리 사용이 끝나면 언제든지 할당한 메모리 공간을 해제할 수 있다.
malloc 함수로 동적 메모리 할당하기

사용자가 malloc 함수로 100 바이트 메모리를 할당하더라도
이 메모리를 2바이트(short) 단위의 50개 데이터 그룹으로 사용할지,
4바이트(int) 단위의 25개의 그룹으로 사용할지는 예상할 수 없다.
그래서 malloc 함수가 메모리의 사용 단위를 결정하지 않고 void* 형식으로 주소를 반환해 주는 것이다.
void*를 사용하면 사용할 때마다 형 변환을 해야 하는 불편함이 있다.
그래서 아래와 같이 malloc 함수를 사용하여 주소를 받는 시점에 사용할 포인터에 미리 형 변환을 사용하는 것이 좋다.

free 함수로 할당된 메모리 해제 하기
스택에 할당한 지역 변수는 함수 호출이 끝나면 스택 프레임에 의해 자동으로 해제된다.
하지만 힙에 할당한 메모리는 프로그램이 끝날 때까지 자동으로 해제되지 않는다.
따라서 free 함수를 사용하여 힙에 할당했던 메모리를 명시적으로 해제해주어야 한다.

동적 메모리 할당의 장단점
힙에 동적으로 할당하는 메모리는 스택에 비해 큰 크기의 메모리를 할당할 수 있으며, 메모리를 할당하고 해제하는 시점도 프로그래머가 직접 정할 수 있다.
그리고 할당되는 메모리 크기도 프로그램 실행 중에 변경할 수 있다.
그래서 할당되는 메모리 크기가 변경되어도 소스 코드를 다시 컴파일 하지 않아도 된다.
하지만 힙에 동적으로 메모리를 할당하고 해제하는 작업을 프로그래머가 직접 관리해야 하기 때문에 코드가 복잡해지며
작은 메모리를 할당해서 사용할 때는 오히려 비효율적일 수 있다.

정적 할당은 스택에 1바이트만 할당된다.
하지만 동적 할당은 스택 대신 힙에 1바이트를 할당하며,
할당 받은 힙의 메모리 주소를 저장하기 위해 스택에 4바이트(포인터 변수 크기)를 할당한다.
따라서 총 5바이트가 필요하다.
16 - 4 동적 메모리 사용하기
배열과 비슷한 형식으로 동적 메모리 사용하기
아래 그림은 p변수가 저장하고 있는 주소에 가서 4바이트 크기로 데이터를 저장하거나 읽을 수 있다는 뜻이다.
그럼 처음 4바이트를 제외한 나머지 8바이트는 어떻게 사용할 수 있을까?

포인터 문법은 포인터 변수에 저장되어 있는 주소로 연산할 수 있다.

위와 같이 사용하면 결국 int형으로 그룹 지어진 메모리를 사용하는 것과 같기 때문에 아래 처럼 선언한 배열과 같은 목적으로 사용할 수 있다.


'컴퓨터 기초 > C언어' 카테고리의 다른 글
| [C언어]52일차-이진탐색과 이진탐색트리 (이것이 c 자료구조와 알고리즘이다) (0) | 2025.11.25 |
|---|---|
| [C언어]51일차 - 순차탐색 (이것이 c 자료구조와 알고리즘이다) (0) | 2025.11.24 |
| [C언어]50일차 - 분리집합 트리(이것이 c 자료구조와 알고리즘이다) (0) | 2025.11.21 |
| 메모리 할당 (0) | 2025.11.20 |
| [C언어]49일차 - 수식트리 (이것이 c 자료구조와 알고리즘이다) (0) | 2025.11.20 |