WinCNT

C 언어 - 14. 동적 메모리 할당 본문

Study/C

C 언어 - 14. 동적 메모리 할당

WinCNT_SSS 2021. 9. 9. 00:27

동적 메모리 할당의 개념

  1. 일반적으로 C언어에서는 배열의 경우 사전에 적절한 크기만큼 할당해주어야 한다
  2. 우리가 원하는 만큼만 메모리를 할당해서 사용하고자 하면 동적 메모리 할당을 사용해야 한다
    ※동적 : 프로그램 실행 도중이라는 의미

동적 메모리 할당 함수

  1. C언어에서는 malloc() 함수를 이용하여 메모리 공간을 확보 가능하다
    ※메모리 공간 확보(memory allocation)
  2. malloc() 함수메모리 할당에 성공하면 주소를 반환하고, 그렇지 않으면 NULL을 반환한다
    ※여기서 주소값은 컴퓨터의 메인 메모리(RAM)의 주소값을 말함
  3. malloc() 함수<stdlib.h> 라이브러리에 정의되어 있다
    malloc(할당하고자 하는 바이트 크기);​

동적 메모리 할당 함수의 특징

  1. 동적 메모리 할당을 수행할 때마다 할당되는 포인터의 주소는 변칙적이다
    (메모리 상에서 남아 있는 공간을 알아서 할당하기 때문)
    #include<stdio.h>
    #include<stdlib.h>
    
    int main(void)
    {
        int *a = malloc(sizeof(int)); //malloc(4)와 동일
        printf("%d\n", a); //malloc() 함수에 의해 할당된 메모리의 주소(임의값)
        /*
            malloc() 함수에 의해 힙 영역 할당된 메모리의 일반적인 비초기화값(-842150451)
            -842150451는 Visual Studio 디버거의 힙 영역의 일반적인 비초기화값
        */
        printf("%d\n", *a);
        
        printf("\n");
        *a = malloc(sizeof(int)); //할당된 메모리에 따로 할당한 메모리의 주소를 넣는 의도치 않은 코드
        printf("%d\n", a);
        printf("%d\n", *a);
    
        printf("\n");
        a = malloc(sizeof(int)); //malloc() 함수로 힙 영역에 메모리를 다시 할당함
        printf("%d\n", a); //새롭운 힙 영역의 메모리 주소로 변함
        printf("%d\n", *a); //새롭게 할당된 주소의 비초기화값(-842150451)
        
        system("pause");
        return 0;
    }
  2. 동적으로 할당된 함수힙 영역에 저장된다
    코드 영역 데이터 영역  힙 영역 스택 영역
    소스 코드 전역 변수
    정적 변수
    동적 할당 변수 지역 변수
    매개 변수
  3. 동적 할당 변수는 free() 함수 등으로 반드시 메모리를 해제해야 한다
    (스택에 선언된 변수는 메모리 해제가 필요 없음)
    메모리 누수(Memory Leak) 방지에는 항상 주의할 필요가 있다
    #include<stdio.h>
    #include<stdlib.h>
    
    int main(void)
    {
        int *a = malloc(sizeof(int)); //동적 메모리 할당
        printf("%d\n", a);
        free(a); //동적 메모리 해방
    
        a = malloc(sizeof(int)); //동적 메모리 재할당
        printf("%d\n", a); //거의 대부분 재할당 전의 메모리를 다시 할당 받음
        free(a); //동적 메모리 해방
    
        system("pause");
        return 0;
    }​

동적으로 문자열 처리하기

  1. memset() 함수 : 일괄적인 범위의 메모리를 모두 특정한 값으로 설정하기 위해 사용하는 함수
    ※메모리 세팅(memory setting)
    int i = memset(포인터, 들어갈 값, 들어갈 크기);​
  2. 한 바이트 씩 값을 저장하므로 문자열 배열의 처리 방식과 흡사하다할 수 있다
  3. memset() 함수는 <string.h> 라이브러리에 정의되어 있다
    #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));
            //printf("%c ", a[i]);과 동일
        }
        system("pause");
        return 0;
    }​

동적 메모리 할당의 다양한 예제

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

int main(void)
{
    //2차원 행렬의 선언
    int** p = (int**)malloc(sizeof(int*) * 3); //행
    for (int i = 0; i < 3; i++)
    {
        *(p + i) = (int*)malloc(sizeof(int) * 3); //열
    }

    //2차원 행렬의 값 입력
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            *(*(p + i) + j) = i * 3 + j;
        }
    }

    //2차원 행렬의 출력
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            printf("%d ", *(*(p + i) + j));
        }
        printf("\n");
    }
    
    //메모리 할당 해제(역순)
    for (int i = 0; i < 3; i++)
    {
        free(p[i]);
    }
    free(p);

    system("pause");
    return 0;
}

 

'Study > C' 카테고리의 다른 글

C 언어 - 16. 구조체  (0) 2021.10.02
C 언어 - 15. 함수 포인터  (0) 2021.09.27
C 언어 - 13. 다차원 배열과 포인터 배열  (0) 2021.09.08
C 언어 - 12. 컴퓨터가 변수를 처리하는 방법  (0) 2021.09.06
C 언어 - 11. 문자열  (0) 2021.09.05