공부/윤성우의 열혈 C 프로그래밍

윤성우의 열혈 C 프로그래밍 Chapter25 메모리 관리와 동적 할당

셩잇님 2022. 11. 25. 11:07
반응형

메모리 구조

메모리의 구성

코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나눠진다.

 

영역별로 저장되는 데이터 유형

코드 영역 : 실행할 프로그램의 코드가 저장되는 메모리 공간
데이터 영역 : 전역번수와 Static 변수가 할당되는 곳. 프로그램 종료시 까지 남아있게 된다는 특징이 있다.
스택 영역 : 지역변수와 전역변수가 할당되는 곳. 함수를 빠져나가면 소멸된다는 특징이 있다.
힙 영역 : 프로그래머가 원하는 시점에 변수를 할당하고 소멸하도록 지원하는 영역

 

메모리의 동적 할당

힙 영역의 메모리 공간 할당과 해제 | malloc, free

// 힙 영역으로 메모리 공간 할당
void * malloc (size_t size);

// 힙 영역으로 메모리 공간 해제
void free(void * ptr)

malloc 함수는 성공 시 할당된 메모리의 주소 값을 반환하며, 실패 시 NULL을 반환한다.

 

malloc 함수의 반환형이 void형 포인터인 이유와 힙 영역으로 접근

malloc 함수의 반환형은 void형 포인터이기 때문에 malloc 함수의 반환 값에 아무런 가공을 가하지 않으면 이를 이용해 할당된 메모리 공간에 접근이 불가능하다.

고로, malloc 함수는 원하는 크기 만큼 메모리 공간을 할당하고 그 메모리 주소 값을 반환하므로 어떻게 사용할 지는 포인터 형 변환을 통해 직접 결정해야 한다.

예)
int * ptr 1 = (int *)malloc(sizeof(int));
double * ptr2 = (double *)malloc(sizeof(double));

참고로 malloc 함수는 메모리 공간 할당에 실패시 NULL을 반환한다.

이로 인해 할당에 성공 여부를 확인하고자 한다면 다음과 같이 코드를 작성해야 한다.

int * ptr 1 = (int *)malloc(sizeof(int));
if (ptr == NULL)
{
	// 메모리 할당 실패에 따른 오류 처리.
}

그리고 malloc 함수의 호출을 통한 메모리 공간의 할당을 가르켜 동적할당이라 한다.

이러한 이유는 할당되는 메모리의 크기를 컴파일러가 결정하지 않고, 프로그램의 실행 중간에 호출되는 malloc 함수가 결정하기 때문이다.

반응형