Taking baby-developer steps

14. 동적 메모리 할당 - 동적 메모리 할당의 개념/동적 메모리 할당 함수(malloc())/ free()함수 / 메모리 누수 방지 / memset()함수 / 동적으로 문자열 처리 본문

CS 지식/C언어_basic

14. 동적 메모리 할당 - 동적 메모리 할당의 개념/동적 메모리 할당 함수(malloc())/ free()함수 / 메모리 누수 방지 / memset()함수 / 동적으로 문자열 처리

Surin Lee 2021. 3. 28. 18:27

동적 메모리 할당

동적 메모리 할당의 원리를 학습하고, 동적 메모리 할당을 이용해 프로그램 실행 도중에 메모리가 할당 되도록 한다.

 

동적메모리 할당의 개념

일반적으로 C언어에서 배열의 경우, 사전에 적절한 크기만큼 할당해야 한다.

원하는 만큼만 메모리를 할당해서 사용하고자 하면, 동적 메모리 할당을 사용해야 한다.

'동적'이라는 말의 의미는 '프로그램 실행 도중에'라는 의미이다.

 

동적 메모리 할당 함수

C언어에서는 malloc()함수를 이용해, 원하는 만큼의 메모리 공간을 확보할 수 있다. malloc()함수는 메모리 할당에 성공하면 주소를 반환하고, 그렇지 않으면 NULL을 반환한다. malloc()함수는 <stdlib.h> 라이브러리에 정의되어 있다.

malloc(할당할 바이트 크기);

malloc()함수가 램(메인 메모리)을 확인해서 현재 할당하고자 하는 만큼의 크기를 사용할 수 있다면, 해당 메모리를 할당하고, 그 주소 값을 반환하는데, 주소를 반환하므로 포인터로 접근이 가능해진다.

 

동적 메모리 할당을 수행할 때마다 할당되는 포인터의 주소는 변칙적이다. 즉, 매번 실행 될 때마다, 또, 실행하는 컴퓨터 마다 포인터 주소가 달라진다.(우연치 않게 동일한 주소를 2번 할당 받을 수도 있다.)

#include <stdio.h>
#include <stdlib.h>

int main(void){
    int *a = malloc(sizeof(int));
    printf("%d\n", a);
    *a = malloc(sizeof(int));
    printf("%d\n", a);
    system('pause');
    return 0;
}

+동적으로 할당 된 변수는 <힙 영역>에 저장된다.

 

전통적인 C언어에서는 스택 영역에 선언된 변수(지역변수, 매개변수)는 따로 메모리 해제를 해주지 않아도 된다.(프로그램 종료와 동시에 알아서 해제가 된다) 반면에, 동적으로 할당된 변수는 반드시 free()함수로 메모리 해제를 해야한다. 메모리 해제를 하지 않으면 메모리 내의 프로세스 무게가 더해져 언젠가는 오류가 발생하며, 메모리 누수(Memory Leak)가 일어난다. 이 메모리 누수는 프로그램이 갑작스럽게 종료되는 중요 원인 중 하나이다. 따라서, 메모리 누수 방지는 코어 개발자의 핵심 역량이다.

malloc 함수와 free함수는 한쌍이다

 

동적으로 문자열 처리하기

일괄적인 범위의 메모리모두 특정한 값으로 설정하기 위해서는 memset()을 사용한다.

memset(포인터, 값, 크기);

한 바이트 씩 값을 저장하므로, 문자열 배열의 처리 방식과 흡사하다. 따라서, memset()함수는 <string.h> 라이브러리에 선언되어 있다.

 

ex) 100B 모두 'A'(를 나타내는 아스크코드(65))로 된 문자열 출력하기.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void){
    char *a = malloc(100);
    memset(a,'A',100);
    for(int i = 0; i<100; i++){
        printf("%c",a[i]);
    }
    system('pause');
    return 0;
}
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

 

요약

  1. 동적 메모리 할당을 이용해 프로그램이 실행중인 도중에 메모리 공간을 배정 받을 수 있다.
  2. 동적으로 할당 받은 프로그램은 반드시 명시적으로 free()함수를 이용해 할당 해제를 해야한다.(프로그램 개발 시 매우 중요한 사항)
Comments