<개인공부>/[C언어, C++]

[C언어] 동적할당 정리2 (malloc, free 예제)

사용자 BlockDMask 2018. 10. 31. 21:54
반응형

1. 동적할당 malloc, free 에 대해서

  • 동적할당이라는 것은 프로그램 실행중에 동적으로 메모리를 할당하는 것을 말합니다.
  • 여기서! 중요한것은 동적으로 메모리를 할당할때 Heap(힙)영역에 할당을 한다는 것 입니다.
  • 메모리 영역에 대해서 궁금하시다면 위에 [운영체제] 프로세스랑? 부분에 정리를 해놓았습니다.
  • 함수 원형은 void* malloc(size_t size) 입니다.
  • 해당 함수를 사용하기 위해서는 <stdlib.h> 헤더파일을 include 해야합니다.
  • 함수 동작은 매개변수에 해당하는 size_t 만큼의 크기만큼 메모리를 할당하고
    • 성공하면 : 할당한 메모리의 첫번째 주소 리턴
    • 실패하면 : NULL 리턴
  • 제일 중요한점
    • 할당한 메모리는 꼭!꼭!꼭!꼭! 해제 해주어야합니다.
    • 그렇지 않으면 메모리 릭, 메모리 누수가 발생합니다. (어마어마하게 자주 발생하니 꼭 잊지 말아주세요)
  • 글로 아무리 설명해 보았자 눈에 들어오지 않으니 바로 예제로 넘어가도록 하겠습니다.

2. 동적할당 malloc, free 예제1 (사이즈가 정해진 배열 복사)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include<stdio.h>
#include<stdlib.h>
 
int main(void)
{
    int arr[4= { 4,3,2,1 };        //크기가 4인 배열 선언
    int* pArr;                        //int 타입을 가리키는 포인터 pArr 선언
 
    //int 타입사이즈 * 4 만큼의 메모리를 할당해라!
    pArr = (int *)malloc(sizeof(int* 4);
    
    if (pArr == NULL)
    {
        //메모리 할당에 실패하면 이쪽으로 들어옵니다.
        printf("malloc error");
    }
 
    for (int i = 0; i < 4++i)
    {
        pArr[i] = arr[i];
    }
 
    for (int i = 0; i < 4++i)
    {
        printf("%d \n", pArr[i]);
    }
 
    //할당한 메모리를 해제해줍니다.
    free(pArr);
 
    system("pause");
    return 0;
}
cs

  • int* pArr = (int *)malloc(sizeof(int) * 4);
  • (int *) = malloc의 반환형이 void* 이므로 (int *)형태로 형변환을 해달라고 한 것 입니다.

    sizeof(int) = sizeof( )는 괄호 안에 자료형 타입을 바이트로 연산해주는 연산자 입니다.

    sizeof(int) * 4 = 곱하기 4를 해준 이유는 위에 선언한 arr[4]사이즈가 가지고 있는 동일한 크기의 메모리를 할당하기 위해서 int 타입 * 4를 해준 것 입니다.


    3. 동적할당 malloc, free 예제2 (과목의 점수 받고, 평균점수 내기)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
     
    int main(void)
    {
        int num;
        int *pArr;
        int average = 0;
        printf("몇개의 과목을 저장할 것인가 자네 : ");
        scanf("%d"&num);
     
        //0개 넣으면 프로그램 종료해.
        if (num == 0)
        {
            return 0;
        }
     
        //과목 개수 만큼 메모리 동적할당을 합니다.
        pArr = (int*)malloc(sizeof(int* num);
     
        //동적할당 실패
        if (pArr == NULL)
        {
            printf("malloc error");
            exit(1);
        }
     
        //점수를 받고 저장합니다.
        for (int i = 0; i < num; ++i)
        {
            printf("[%d/%d]점수 입력 : ", i + 1, num);
            scanf("%d"&pArr[i]);
        }
        
        //출력
        for (int i = 0; i < num; ++i)
        {
            printf("%d번째 과목의 점수 : %d\n", i + 1, pArr[i]);
        }
        
        //평균 출력
        for (int i = 0; i < num; ++i)
        {
            average += pArr[i];
        }
        
        //정수로 나누어 지기 때문에 소수점 이하는 버려집니다.
        average /= num;
        printf("평균 : %d\n", average);
     
        //동적할당 해제
        free(pArr);
     
        system("pause");
        return 0;
    }
    cs

    반응형