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 |
댓글