동적 메모리 할당이란 프로그램이 실행 도중에 동적으로 메모리를 할당 받는 것을 말한다. 프로그램에서는 필요한 만큼의 메모리를 시스템으로부터 할당을 받아서 사용하고, 사용이 끝나면 시스템에 메모리를 반납한다. 필요한 만큼만 할당을 받고 또 필요한 때에 사용하고 반납 메모리를 효율적으로 사용할 수 있는 것이다. 동적 메모리는 malloc()계열의 라이브러리 함수를 사용하여 할당 받아 사용할 수 있다.
동적메모리는 마치 수납 공간에서 물건을 꺼내는 것과 비슷하다. 물건의 사용이 끝나면 다시 수납 공간에 물건을 놓아햐한다. 만약 물건을 제대로 반납하지 않으면 다른 사람이 해당 물건을 사용할 수 없기 때문이다. 메모리 또한 마찬가지다. 동적 메모리의 사용이 끝나면 반드시 해당 메모리 영역을 명시적으로 반납해주어야한다.
#include <stdio.h>
#include <stdlib.h>
// 동적 메모리 기초 예제
int main(void) {
int* pi; //Point Integer를 뜻함
pi = (int*)malloc(sizeof(int)); // malloc = 메모리를 할당하라.(int의 크기만큼 할당하라.)
//(int*) 이 뜻은 소괄호안에있는것으로 형변환 해달라는 뜻이다.
if (pi == NULL) { //동적메모리 할당에 실패 했다면
printf("동적 메모리 할당에 실패했습니다. \n");
exit(1); // 이프로그램을 종료한다.
}
*pi = 100; //pi라는 포인터 값에 100을 넣어준다.
printf("%d\n", *pi); //그리고 그값을 출력하면 된다.
free(pi);
// 동적 메모리 사용한 이후에는 무조건 메모리를 반환한다. 이것은 매우 중요하다.
// 전반적으로 메모리의 안정성과 효율성을 높이기 떄문이다.
// 현재 할당된 4byte만큼의 메모리를 할당 해재해준다는 의미이다.
return 0;
}
#include <stdio.h>
#include <stdlib.h>
// 동적메모리로 알파벳 출력하기
int main(void) {
char* pc = NULL;
int i = 0;
pc = (char*)malloc(100 * sizeof(char)); //하나의 문자만큼들어가는 캐릭터의 100배를 한것이다.
if (pc == NULL) {
printf("동적 메모리 할당에 실패했다.\n");
exit(1);
}
for (i = 0; i < 26; i++) {
*(pc + 1) = 'a' + i;
}
*(pc + i) = 0;
//아스키 코드에서 0은 NULL을 의미한다.
printf("%s\n", pc);
free(pc);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main(void){
int* pi, i;
pi = (int*)malloc(5 * sizeof(int));
// Ram에 총5개의 공간이 할당이 되어서 그중 첫번째에 해당하는 메모리 주소를 pi가 가지게됨.
if (pi == NULL) {
printf("동적 메모리 할당에 실패하였습니다.\n");
exit(1);
}
pi[0] = 100;
pi[1] = 200;
pi[2] = 300;
pi[3] = 400;
pi[4] = 500;
for (i = 0; i < 5; i++) {
printf("%d\n", *(pi + i));
}
free(pi);
return 0;
}