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 |