[C언어] # 10. 동적 메모리 할당 (Dynamic Memory Allocation)

Crush_on_Study·2022년 6월 10일
0

C언어 기초

목록 보기
11/11

오늘은 C언어를 배우는데 있어서 가장 어려운 개념을 다루고자 합니다.
이 부분은 정말 열심히 보시고, 또 보셔야 합니다. 배열과 포인터를 토대로 이루어진 개념입니다.

동적 메모리 할당 & 메모리 구조

동적 메모리 할당이 뭐에요?

  • 우리가 배열을 선언할 때 보면, 얼마나 공간을 할당해줘야할지 몰라서 그냥 임의의 개수를 정의하곤 합니다.
    #7. 예제 풀이 (3)

여기 보시면 제가 배열 num을 100개의 공간으로 임의로 할당 했습니다.
근데, 이렇게 두면 공간이 부족할 때도 있고 혹은 남아서 메모리 누수가 있을 때도 있을 겁니다. 상당히 비효율적이란 거죠.

주어진 메모리 Capa는 제한적이기 때문에, 우리는 이 메모리 자원을 효율적으로 사용할 방법을 찾게 됩니다. 그게 바로 동적 메모리 할당입니다.

동적 메모리 할당은 메모리 공간을 Heap 영역에서 빌려옵니다.

  • Heap영역이요?

C언어의 메모리 구조는 위 사진과 같습니다.

#include <stdio.h>
int main()
{
	int i;
    
    return 0;
}

이 코드에서 변수 i는 main함수 내에서 선언되었습니다. 이러한 변수를 '지역 변수'라 하고 해당 변수의 메모리 영역은 스택 영역이라 합니다.

이 영역에 선언된 변수들은 함수가 종료될 시, 해제됩니다. 그럼 이제 힙 영역을 보겠습니다.


힙 영역 (Heap)

힙 영역은 메모리 은행 창고다!

힙 영역은 비유한 바와 같이 우리가 필요한만큼 메모리를 빌려서 쓴 후, 프로그램 종료 시 메모리를 다시 반환하는 공간입니다.

대표적인 동적메모리함수는 malloc/free 세트가 있습니다.

  • malloc : 메모리 빌리기 (자료형에 따라 메모리 크기 다름)
  • free : 빌린 메모리를 반환하는 함수. (선언하지 않을 시, 메모리 누수 발생)

예제 코드

예제 코드를 한번 보겠습니다.

#include <stdio.h>
#include <stdlib.h>

int main()
{
	int i,n;
	scanf("%d",&n);
	
	int *grade = (int*)malloc(sizeof(int)*n);
	if (grade == NULL)
	{
		printf("동적 할당에 실패함.");
		exit(1);	
	}
	
	for (i=0; i<n; i++)
	{
		scanf("%d",&grade[i]);
	}
	
	for (i=0; i<n; i++)
	{
		printf("%d ",grade[i]);
	}
	
	free(grade);	
	return 0;
} 

결과 화면

코드가 좀 많이 어려워보이죠? 그래도 하나씩 살펴보겠습니다.

코드에 대한 설명
1. 변수 i는 배열의 인덱스를 , n은 입력받을 원소의 개수를 의미했습니다.
2. int *grade = (int*)malloc(sizeof(int)*n);

와? 2번 대체 뭔가요? 저는 모르겠어요... 포기할래요... 하셨겠지만 천천히 살펴봅시다.

앞에서 우리는 *가 의미하는 바는 변수 앞에 있을 경우 포인터를, 두 변수 사이에 있을 경우는 곱셈연산자라 하였습니다. 따라서 이 경우는 포인터변수를 지칭합니다.


포인터 변수는 변수를 선언함과 동시에 부여된 메모리 주소값을 '가리키는 것'이라 했었죠? 그럼 위 소스코드를 천천히 보겠습니다.

int *grade = (int*)malloc(sizeof(int)*n);

grade라는 포인터 변수는 malloc함수를 통해서 메모리 공간 한 개당 'int'타입 (4Byte)의 방을 n개만큼 할당하여, 그들의 주소를 가리키는 것이다. 라고 해석할 수 있습니다.


<출처 - TCP School님의 '1차원 배열' 글>

이런 식으로 말이죠! 그림을 보면 grade라는 변수는 배열로 선언된거 같네요! 그리고 주소값을 보니 한 공간 당 4Byte인듯 합니다. 10~13 / 14~17 / 18~ 1B 이렇게 나와있으니까요!

즉, int *grade라고 한다면 n개의 공간을 할당받은만큼 '연속적인 메모리 주소를 부여받았다' 라는 특징도 함께 알 수 있겠습니다.

profile
방구석백수 코드몽키

0개의 댓글