"
10칸의 전철이 있다. 평균 승객의 수를 고려한다면 4칸 정도만으로도 충분히 승객을 태울 수 있다.
만약 승객의 수에 따라서 전철 칸 수를 늘리고 줄일 수 있다면 효율적인 운행이 가능해진다.
프로그램 메모리에도 필요에 따른 크기 할당이 가능한 것이 바로 동적 메모리 이다.
"
동적 메모리 이해
특 징 | 정적 메모리 | 동적 메모리 |
메모리 할당 | 컴파일 단계에 이루어짐 | 실행 시간에 이루어짐 |
메모리 해제 | 자동으로 해제 | 명시적으로 해제 필요 |
사용 범위 | 지역 변수는 선언된 블록 내, 전역 변수는 프로그램 전체에서 사용할 수 있음 | 프로그래머가 원하는 동안 만큼 사용할 수 있음 |
메모리 관리 | 컴파일러의 책임 | 프로그래머의 책임 |
개요
1. 데이터의 갯수를 미리 알 수 없을 때 사용
2. 처리 대상 데이터가 유동적일 때, 특히 변동 폭이 큰 경우
종류
1. 헤더파일 stdlib.h
함 수 | void* malloc(size_t size); |
설명 | - 실행 시 메모리를 할당(초기화 없음) - size: 할당 크기 |
반환 | - 할당된 메모리 포인터를 반환 - 할당 실패 시 null을 반환 |
함 수 | void* calloc(size_t num, size_t size); |
설명 | - 실행 시 메모리를 할당(초기화 0) - num: 갯수 - size: 기본 크기 |
반환 | - 할당된 메모리 포인터를 반환 - 할당 실패 시 null을 반환 |
함 수 | void* realloc(void* prt, size_t size); |
설명 | - 할당된 메모리의 크기를 변경(재할당) - ptr: 재할당 메모리 포인터 - size: 재할당 크기 |
반환 | - 재할당된 메모리 포인터를 반환 - 할당 실패 시 null을 반환 |
함 수 | void free(void* ptr) |
설명 | - 할당된 메모리를 해제 - ptr: 해제할 메모리 포인터 |
반환 | - none |
2. malloc()
char* arr;
arr = malloc(5);
char형 1byte 가 5개 = 총 5byte
int* arr;
arr = (int*) malloc(20);
int형 4byte가 5개 = 총 20byte
3. free()
int* arr;
arr = (int*) malloc(5);
free(arr); // 메모리 해제
4. calloc()
int* arr;
arr = (int*) calloc(5, 4); // 4byte가 5개의 메모리 = 총 20byte 할당, 0으로 초기화
5. realloc()
int* arr;
arr = (int*) malloc(8);
arr = (int*) realloc(arr, 20); // arr을 8byte에서 20byte로 재할당
기초 활용
#include <stdio.h>
#include <stdlib.h>
int main()
{
char* a;
int size;
scanf("%d, &size);
a = malloc(sizeof(char)*size);
strcpy(a, "hi");
printf("문자수: %d 문자열: \n", strlen(a), a);
free(a);
return 0;
}
Q. 문자열을 입력받고 하나의 동적 메모리에 계속 붙여서 저장하는 프로그램을 작성하시오. ("end" 입력시 입력 종료)
#include <stdio.h>
#include <stdlib.h>
int main()
{
char* a, str[20];
a = (char*) calloc(1, 1);
if (a == NULL) printf("Fail Allocation"); // 할당 실패 로그를 찍을 필요 있음
while(1)
{
gets(str);
if (!strcmp(str, "end")) break; // "end" 입력 시 루프 해제
a = (char*) realloc(a, strlen(str) + 1); // 입력 받은 str 크기보다 +1 많은 메모리(null문자 포함하기 때문) 재할당
strcat(a, str); // a에 str을 붙임
} // 동적 메모리 크기가 입력에 따라서 변동
printf("\n%s", a);
free(a);
return 0;
}
* 메모리 사용이 유동적일 경우 동적 메모리 사용은 매우 유용할 듯..
'프로그래밍 언어 공부 > C' 카테고리의 다른 글
도서관리 시스템 고도화(동적메모리) (0) | 2022.01.17 |
---|---|
함수 포인터(Function Pointer) (0) | 2022.01.15 |
수학 관련 라이브러리 (0) | 2022.01.13 |
도서관리 시스템 구현 (0) | 2022.01.13 |
문자 처리 라이브러리 (0) | 2022.01.12 |