Young & Rich

안녕하세요. 오늘은 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;
}

 

2차원 동적할당
2차원 동적할당

 

[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.

 

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band