본문 바로가기
c

18_동적할당1(Dynamic Allocation) - malloc

by RongBee 2023. 4. 26.

C언어에서 동적 할당의 개념이란?

 

메모리를 좀 더 효율적으로 쓰기 위해 사용하는 개념이다.

 

어떻게 효율적으로 쓸까?

 

프로그래머는 동적 할당을 통해 프로그램이 실행되는 런타임 상태일 때 동적으로 메모리에 할당할 수 있게 된다.

 

필요한 메모리의 크기가 컴파일 시간이 아니라 런타임에 결정될 수 있다.

 

이러한 특성은 메모리 크기를 미리 결정할 수 없거나 사용자 입력 또는

 

기타 프로그램 조건에 따라 달라질 때 유연한 프로그래밍을 할 수 있게 된다.

 

 

먼저 메모리 영역에 대해 알아보고, 어떤 영역이 동적 할당이 이루어지는지 알아보자.

 

 

Code Area 함수상수, 실행한 프로그램의 소스코드가 저장되는 공간이며, 함수나 상수는 컴파일 단계에서 검사를 마치고 저장되므로 이곳은 정적 메모리이다.
Data Area 전역 변수정적 변수가 저장되는 영역이다.
Code Area와 마찬가지로 컴파일 단계에서 검사 후 메모리 할당이 이루어진다.
Stack Area 지역 변수매개변수가 저장되는 영역이다. 
즉 변수를 선언하면 이 영역에서 공간을 할당해준다.
이 영역이 동적 메모리인 이유는 함수를 예로 들면 함수의 명령을 다 마친 후 변수는 사라지지만, 이 영역에 변수가 생성되었다가 사라졌다가 하기 때문에 동적 메모리라고 한다.
Heap Area 사용자가 직접 관리할 수 있으며 사용자에 의해 메모리 공간이 동적으로 할당되고, 해제되는 영역이다.
동적 할당을 하면 해당 공간을 사용하기 위해 생성한 위치의 주소를 포인터로 저장하여 그 공간을 활용해야 한다.
할당한 공간이 할 일을 마쳤다면 메모리를 낭비하지 않기 위해 반드시 해제해줘야 한다.
할당된 공간을 가르키는 포인터가 해제된 공간을 가르키지 않도록 0으로 초기화를 해줘야 한다.

 

 

 

우선 동적 할당 키워드인 malloc함수를 사용하기 위해선 <stdlib.h> 파일을 포함시켜야 한다.

 

동적 할당을 위해 생성할 메모리 공간은 어떤 자료형으로 만들어져 있는지

모르기 때문에 프로그래머가 직접 선언해줘야 한다.

 

예제를 통해 동적 할당을 사용해보자.

 

printf("[char]\n");
	char* a = (char*)malloc(1);

	printf("동적할당한 공간의 주소            : %p \n", a);
	printf("초기화하지 않은 공간의 값(쓰레기) : %c\n", *a);
	*a = 'a';
	printf("초기화 한 공간의       값         : %c\n", *a);

	free(a);
	printf("a가 저장하고 있는 주소            : %p \n", a);
	a = NULL;
	Line;

	printf("[short]\n");
	short* b = (short*)malloc(2);

	printf("동적할당한 공간의 주소            : %p \n", b);
	printf("초기화하지 않은 공간의 값(쓰레기) : %d \n", *b);
	*b = 20000;
	printf("초기화 한 공간의       값         : %d \n", *b);

	free(b);
	printf("b가 저장하고 있는 주소            : %p \n", b);
	b = NULL;
	Line;

	printf("[float]\n");
	float* c = (float*)malloc(4);

	printf("동적할당한 공간의 주소            : %p \n", c);
	printf("초기화하지 않은 공간의 값(쓰레기) : %f \n", *c);
	*c = 3.14;
	printf("초기화 한 공간의       값         : %f \n", *c);

	free(c);
	printf("c가 저장하고 있는 주소            : %p \n", c);
	c = NULL;
	Line;

	printf("[double]\n");
	double* d = (double*)malloc(8);

	printf("동적할당한 공간의 주소            : %p \n", d);
	printf("초기화하지 않은 공간의 값(쓰레기) : %lf \n", *d);
	*d = 3.1415926535897932384626433832795028;
	printf("초기화 한 공간의       값         : %.100lf\n", *d);

	free(d);
	printf("d가 저장하고 있는 주소            : %p\n", d);

 

 

위를 보면 char*와 short* 등등 자료형을 선언 후 malloc을 선언 후

캐스팅 연산자에 자료형의 크기 size를 선언하여 사용한다.

 

 

Line은 #define으로 설정한 줄바꿈 코드이다.

'c' 카테고리의 다른 글

19_동적할당2(Dynamic Allocation) - calloc  (0) 2023.04.30
17_정적변수(static)  (2) 2023.04.23
16_지역, 전역변수(Local, Global Variable)  (0) 2023.04.20
15_포인터(Pointer)  (0) 2023.04.17
14_함수(Function)  (0) 2023.04.14

댓글