반응형
1. 동적할당 malloc, free 에 대해서
2017/07/10 - [<개인공부>/[C언어 & C++ 언어]] - [C 언어] 동적할당 정리1 (malloc, realloc, calloc, free 함수)
2017/07/07 - [<개인공부>/[Operating System]] - [운영체제] 프로세스란? (스케줄링, 메모리구조, 상태변화)
- 동적할당이라는 것은 프로그램 실행중에 동적으로 메모리를 할당하는 것을 말합니다.
- 여기서! 중요한것은 동적으로 메모리를 할당할때 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 *) = 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 |
반응형
'<개인공부> > [C언어, C++]' 카테고리의 다른 글
[C언어/C++] 절대값 함수 abs, fabs에 대해서. (3) | 2019.03.18 |
---|---|
[C언어/C++] atoi, atof, atol 함수 (char* to int) (13) | 2019.03.14 |
[C언어/C++] rand, srand, time 랜덤함수에 대해서 (난수생성) (37) | 2019.01.11 |
[C언어/C++] pow, sqrt 함수에 대해서(루트함수, 제곱, 제곱근) (4) | 2019.01.04 |
[C언어/C++] assert 함수에 대해서 : 디버깅을위한, 더 안전한 코드를 위한 오류 검출 방법 (2) | 2018.10.24 |
[C언어/C++] define 매크로와 inline 함수에 대해서 (3) | 2017.11.03 |
[C언어/C++] clock 함수를 통한 알고리즘 시간 측정 (0) | 2017.10.19 |
[C언어/C++] 올림, 내림, 반올림 (floor, ceil) 함수 (8) | 2017.08.11 |