프로그래밍 언어 공부/C

동적 메모리

CalebHong 2022. 1. 15. 16:17

"

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;
}

 

* 메모리 사용이 유동적일 경우 동적 메모리 사용은 매우 유용할 듯..