안녕하세요. 오늘은 C언어 동적할당에 대해서 포스팅을 해보겠습니다.
동적할당이란?
동(動, 움직일 동) 적할당입니다.
사용자가 필요한 만큼 동적으로 메모리를 할당하는 것을 의미합니다.
반대말로는 정적이라는 말이 있습니다.
사용자가 int num[10]; 이렇게 사용하면 10만큼 정적으로 메모리를 사용하는 것을 의미합니다.
사용자가 필요한만큼 메모리를 할당해서 사용하고 다 쓰면 반환하는 방식입니다.
malloc 의 사용
memory allocation 의 메모리 할당의 약어입니다.
void *malloc(size_t size);
필요한 사이즈 만큼 할당받습니다.
성공 시 : 할당된 메모리의 첫 번째 주소값
실패 시 : NULL
free 의 사용
void free(해제할 메모리 주소값);
"OS 야 나 int 형 크기 10의 배열만큼 메모리가 필요해" : malloc 함수
"오케이. 자 여기 주소값 있으니깐, 이거 가지고 사용해" : malloc 성공 시 받은 주소값
"자 여기 다 썼어. 이제 필요없으니깐 사용한 거 없애줘." : free 함수
위와 같은 방식으로 사용됩니다.
예제를 보면서 이해해보겠습니다.
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *num = NULL;
int count = 10, i = 0;
num = (int *)malloc(sizeof(int) * count); // int num[10] 만큼의 동적할당
if ( num == NULL ) // 동적할당 실패 예외처리
{
printf("동적할당 실패\n");
return -1;
}
printf("할당받은 주소값 : %p\n", num);
for (i=0; i<count; i++) // 숫자 입력받기
{
printf("%d 번째 숫자를 입력하세요 : ", i+1);
scanf("%d", &num[i]);
}
for (i=0; i<count; i++) // 입력받은 숫자 출력
{
printf("입력한 %d 번째 숫자 : %d\n", i+1, num[i]);
}
free(num); // 사용한 메모리 해제하기
return 1;
}
void * 이기 때문에 (int *) 캐스팅해주어야 합니다.
malloc 을 요청하면 OS 에서는 int형 크기 10의 메모리를 할당한 다음, 첫 번째 주소값을 반환합니다.
그리고 free 를 하기 전까지는 계속 메모리가 할당되어있는 상태입니다.
사용자가 다 사용하고 필요없을 때 free를 하기 전까지요.
그래서, memory 를 malloc 하고 free 를 하지 않으면, 계속 할당만 (메모리 자리만 차지) 합니다.
메모리 누수현상(Memory Leak)이 발생할 수 있으니 malloc한 다음엔 꼭 free 해주세요.
동적할당에 대해서 간단하게 기본개념을 포스팅해보았습니다.
자 이제, 2차 배열에 대한 동적할당은 어떻게 할 껀지 예제를 보면서 이해해보겠습니다.
#include <stdio.h>
#include <stdlib.h>
int main()
{
int **num = NULL;
int class_cnt = 5, people_cnt = 10;
int i = 0, j = 0;
num = (int **)malloc(sizeof(int *) * class_cnt); // int num[10] 만큼의 동적할당
if ( num == NULL ) // 동적할당 실패 예외처리
{
printf("동적할당 실패\n");
return -1;
}
for ( i = 0; i < class_cnt; i++)
num[i] = (int *)malloc(sizeof(int) * people_cnt);
/* 동적할당 받은 2차원 변수 사용 */
// Command ....
for ( i = 0;i < class_cnt; i++) // 사용한 메모리 해제
free(num[i]);
free(num); // 사용한 메모리 해제하기
return 1;
}
[n][m] n 개의 동적할당을 먼저하고 n 번만큼 for 문을 돌면서 m개의 동적할당을 합니다.
free를 할 때는 역순으로 해줍니다.
3차 동적할당도 동일합니다. [n][m][k] 라고 하면
n 개의 2차원 포인터 배열의 주소로 캐스팅하면서 malloc 을 먼저하고
n 번 만큼 m 개의 동적할당을 한 뒤에
다시 m 번만큼 k 동적할당을 호출합니다.
3차원 동적할당 예제
#include <stdio.h>
#include <stdlib.h>
int main()
{
int ***num = NULL;
int i = 0, j = 0;
int n = 2, m = 3, k = 4;
num = (int ***)malloc(sizeof(int **) * n);
for ( i = 0; i < n; i++)
{
num[i] = (int **)malloc(sizeof(int*) * m);
for( j = 0; j < m; j++)
num[i][j] = (int *)malloc(sizeof(int) * k);
}
/* 동적할당 받은 3차원 변수 사용 */
// Command ....
for ( i = 0; i < n; i++) // 사용한 메모리 해제
{
for ( j = 0; j < m; j++)
free(num[i][j]);
free(num[i]);
}
free(num);
return 1;
}
맨 앞의 크기부터 할당을 하고 그걸 부채 펴듯이 malloc 한다고 생각하시면 이해가 쉬울 것 같습니다.
부디 즐거운 C언어 공부되시길 바랍니다.
그럼 20000.
C언어 문자열 관련 함수 strcpy, strncpy, sprintf, snprintf, strcat, strncat (4) | 2020.04.13 |
---|---|
C언어 memset, memcpy 메모리(데이터) 초기화 및 복사 (4) | 2020.04.09 |
10강 C언어 파일 입출력, C언어 FILE (0) | 2020.02.03 |
9강 C언어 구조체 (0) | 2020.01.30 |
8강 C언어 함수(Function), API (0) | 2020.01.29 |