C/C언어 이론

(10)MemoryAllocation

태영_ 2018. 6. 20. 13:46

메모리 동적 할당

- 정적 할당 : 일반 변수나 배열 (코드에 공간의 크기 고정)

 > 우리가 여태 사용하던 방식


- 동적 할당 : 함수를 이용하여 '런타임' 도중 원하는 크기의 메모리 할당

  > 런타임 : 프로그램 실행 중

  > malloc() : 메모리 할당 (공간을 만든다)

  > free() : 할당된 메모리 해제 (공간 삭제)

- 정적 할당은 기본적으로 자동 소멸이 된다. (지역변수 : 지역이 끝나면 소멸)

 malloc() 으로 동적 할당한 공간은 자동 소멸이 되지 않는다.

 반드시 malloc()으로 할당한 공간은 사용을 다 한 뒤, free()로 삭제!

> 자바의 경우, JVM(java.exe)이 메모리 관리를 해준다.

    사용을 다 한 공간이나 불필요해진 공간은 자동 삭제


    > 우리가 직접 삭제를 하지 않으면, 동적 할당한 공간은 메모리 상에 계속

            존재하게 되며.. 이러한 메모리가 계속 쌓이면 프로그램 오류!!

    (메모리 누수 현상)


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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
void main()
{
    // 3개 과목의 점수를 입력 받고, 총점과 평균을 출력하는 프로그램 (정적 할당)
    //    --> 과목의 개수를 입력 받아서 유동적으로 공간을 만들도록 수정 (동적 할당)
 
    /*
    // 정적 할당 코드 --> 배열의 크기가 변경될 때마다 프로그램을 새로 만들어줘야 한다..
    int iArrScore[5]    = {0, };
    int iTotalScore        = 0;
    int i = 0;
    printf("5개 과목 점수 입력 : ");
    
    // 입력 받는 for문
    for( i = 0; i < 5; i++ )
    {
        scanf("%d", &iArrScore[i]);
    }
    // 총점 누적하는 for문
    for( i = 0; i < 5; i++ )
    {
        iTotalScore += iArrScore[i];
    }
    printf("총점 : %d점\n", iTotalScore);
    printf("평균 : %.1f점\n", iTotalScore/5.);
    */
 
    // 동적 할당 코드
    int iCount        = 0;
    int * pArrScore = NULL// 동적 할당에 필요한 포인터 변수
    int iTotalScore    = 0;
    int i = 0;
 
    for(i = 0; i < 1000; i++)
    {
        pArrScore = (int*)malloc(1000000);
        free(pArrScore);
    }
 
 
    printf("입력할 과목의 수 : ");
    scanf("%d"&iCount);
 
    // iCount가 5라고 가정을 하면, int iArrScore[5];
 
    //            (형변환)         (만들고 싶은 공간의 크기)
    pArrScore = (int *)malloc( iCount * sizeof(int) ); // stdlib.h 필요
    // malloc()은 공간을 만든 뒤, 그 공간을 사용할 수 있도록
    // 만든 공간의 시작 주소 값을 '반환'해준다. (return)
    // 반환 값을 대입 받을 포인터의 타입은 malloc() 기준에선 모르기 때문에
    // 우리가 사용할 포인터의 타입으로 '형변환'을 해줘야한다.
 
    {
        char * pFileText = NULL;
        int        iTextLen = 1000;
        pFileText = (char *)malloc( iTextLen * sizeof(char+ 1 );
        // 뒤에 널문자가 있으니까 할당할 때 널문자를 고려해서 +1을 해준다.
 
        free(pFileText);
    }
 
    // 동적 할당하고 나서 하나 빠진게 있음.. (중요한!!)  '초기화'
    // 우리가 직접 초기화를 할 수 있는 함수
 
    // memory setting  ( 값을 세팅할 주소, 세팅할 값, 크기 )
    memset( pArrScore, 0, iCount*sizeof(int) ); // string.h 필요
 
    // 동적 할당 + 초기화까지 완료가 되면 우리는 포인터변수를 배열처럼 쓸 수 있다.
    printf("%d개 과목 점수 입력 : ", iCount);
    
    // 입력 받는 for문
    for( i = 0; i < iCount; i++ )
    {
        scanf("%d"&pArrScore[i]);
    }
 
    // 총점 누적하는 for문
    for( i = 0; i < iCount; i++ )
    {
        iTotalScore += pArrScore[i];
    }
    
    // 해제하고 나면 pArrScore는 쓸 수 없다.
    free(pArrScore);
 
    printf("총점 : %d점\n", iTotalScore);
    printf("평균 : %.1f점\n", (float)iTotalScore/iCount);
}
cs