동적 할당

Kimbab1004·2024년 7월 5일
0

CPP

목록 보기
13/27

Malloc

동적 메모리 할당을 위해 사용되는 함수이다. 이 함수는 힙 영역에서 사용자가 지정한 크기만큼의 메모리를 할당하고, 그 메모리 블록의 시작 주소를 반환합니다.

동적 할당을 해야 하는 이유는?

1. 가변적인 메모리 요구사항 처리
프로그램 실행 중 필요한 메모리 크기를 사전에 알 수 없는 경우, 동적 메모리 할당을 통해 필요한 만큼의 메모리를 런타임에 할당할 수 있습니다. 이는 특히 배열이나 데이터 구조의 크기가 가변적인 경우에 유용합니다.
예를 들어, 사용자가 입력한 데이터의 크기에 따라 메모리를 할당할 수 있습니다.

2. 효율적인 메모리 사용
정적 메모리 할당은 프로그램 실행 동안 메모리를 고정된 크기로 할당하기 때문에 메모리 낭비가 발생할 수 있습니다. 동적 메모리 할당을 사용하면 필요한 시점에 필요한 만큼의 메모리를 할당하고, 사용 후에는 해제하여 메모리 효율성을 높일 수 있습니다.

3. 대형 데이터 구조 관리
큰 크기의 데이터 구조나 복잡한 자료 구조를 동적으로 관리할 수 있습니다. 예를 들어, 연결 리스트, 트리, 그래프 등의 자료 구조는 동적 메모리 할당을 통해 효율적으로 구현할 수 있습니다.
이러한 자료 구조는 크기가 실행 중에 변할 수 있으며, 동적 메모리 할당을 통해 이러한 변화를 유연하게 처리할 수 있습니다.

4. 재사용 가능 메모리
메모리를 동적으로 할당하고 필요 없을 때 해제하면 다른 용도로 재사용할 수 있습니다. 이는 특히 제한된 메모리 환경에서 중요한 이점입니다.

5. 복잡한 데이터 관리
프로그램에서 다양한 크기와 형태의 데이터를 처리해야 하는 경우, 동적 메모리 할당을 통해 메모리를 유연하게 관리할 수 있습니다. 예를 들어, 다양한 길이의 문자열을 처리하거나, 다른 형태의 데이터 구조를 동적으로 생성하여 처리할 수 있습니다.

예제 코드

#include <stdlib.h>

// 메모리 영역
// 1. 스택 (함수, 지역변수)
// 2. 데이터 ( 프로세스 시작 시, 프로세스 종료 시)
//   - 전역변수, 정적변수, 외부변수
// 3. ROM ( Relad Only Memory )
//   - 전역 변수 초기화 데이터, 문자열 데이터, 코드
// 4. 힙 (Heap)
//   - 동적할당으로 사용 가능

typedef int MYINT;

//#define MYINT int




int global[2000] = {};

int main()
{		
	int arr[100] = {};

	MYINT a = 0;

	// F12
	size_t size = 0;
	time_t time = 0;

	// 동적할당
	int* pData = (int*) malloc(20);

	pData[0] = 10; // *(pData + 0)
	pData[1] = 20; // *(pData + 1)
	pData[2] = 30; // *(pData + 2)
	pData[3] = 40; // *(pData + 3)
	pData[4] = 50; // *(pData + 4)

	// 할당하지 않은 공간까지 포인터를 이용해 접근해서 데이터를 기록(사용) 한 경우
	// Heap Corruption( 힙 손상 )
	pData[5] = 60; // *(pData + 4)
	pData[6] = 70; // *(pData + 4)

	// 1. 힙 메모리 영역에 할당하지 않은 곳까지 접근, 데이터를 사용
	// 2. 할당한 힙 영역에 대한 반환이 이루어지지 않음
	//   - 메모리 누수(Leak)

	free(pData);

	//int IArr[3] = {};
	//IArr[3] = 10;

	return 0;
}

0개의 댓글