본문 바로가기

프로그래밍/C언어

[C언어] 동적 메모리 할당

안녕하세요 ! 초보개발자 입니다. 

이 블로그는 개인 공부 정리용 블로그 입니다. 

혹 잘못된 내용이 있다면 지적 부탁드리겠습니다.

그리고 질문주신다면 최대한 아는선에서 답변드리도록 하겠습니다.

그럼 시작하도록 하겠습니다.



동적 메모리 할당


함수 내에 지역적으로 선언된 변수나 배열은 함수가 종료가 되면 메모리에서 사라 집니다. 그렇기 때문에 다른 함수에서 다시 사용할 수 없습니다. 다른 함수에 사용하기 위해 전역적으로 선언하면 되지만 이 방법은 프로그램의 종료까지 메모리 공간을 사용하므로 비효율 적입니다. 이러한 불편함 때문에 필요할 때만 메모리를 할당 받아 사용하고 반납하는 것이 바로 동적 메모리 할당 입니다.

다시 정리 해보자면 동적 메모리 할당이란 프로그램이 실행 중에 원하는 시간에 메모리를 할당 받는 것으로 효율적인 메모리 사용이 가능 합니다.

malloc() 함수

그렇다면 동적으로 메모리를 할당 받기 위해서는 어떻게 해야 할까? 위의 제목에서도 알다시피 malloc() 함수를 이용 합니다.

malloc(4) // 동적 할당. 함수 호출로 4byte의 공간을 확보

malloc(4)를 통해 4byte의 공간을 확보하였는데 변수와는 달리 이름이 없습니다. 그렇다면 4byte의 공간을 어떻게 활용 할까요 ? 눈치 채신분들도 있겠지만 우리가 이때 까지 배웠던 포인터를 통해서 사용할 수 있습니다. 변수처럼 이름이 없기 때문에 오직 포인터를 통해서만 접근할 수 있습니다. 
malloc의 반환값은 메모리의 주소 값이고 반환값을 포인터에 저장 할 수 있습니다. malloc함수를 통해 할당 받은 메모리는 이전 데이터가 그대로 남아 있을 수 있습니다. 초기화가 필요할 경우 memset() 함수를 사용 합니다. 

      int * p = malloc(10);
memset(p,0,10); 

memset(p,0,10) 은 동적으로 받은 메모리를 모두 0으로 채운다는 뜻입니다.

예제를 통해서 동적 메모리 할당에 대해 알아 보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<stdio.h>
#include<stdlib.h>
 
int main(void) {
 
    int arr[] = { 10,20,30,40,50 };
    int length = sizeof(arr) / sizeof(arr[0]);
 
    int *= malloc(sizeof(arr));
 
    for (int i = 0; i < length; i++) {
        p[i] = arr[i];
        printf("arr[%d] = %d, p[%d] = %d\n", i, arr[i], i, p[i]);
    }
 
    return 0;
}
 
cs

위의 예제는 배열 arr의 크기만큼 동적 메모리를 할당하여 배열 arr의 요소들을 동적메모리에 똑같이 저장하는 소스 입니다. 포인터를 이용하여 배열과 똑같이 사용할 수 있습니다.

위예제의 결과는 다음과 같이 나올 것입니다.

arr[0] = 10, p[0] = 10

arr[1] = 20, p[1] = 20

arr[2] = 30, p[2] = 30

arr[3] = 40, p[3] = 40

arr[4] = 50, p[4] = 50


이상으로 동적 메모리 할당에 대해서 알아 보았습니다. 다음시간에 이어서 동적 메모리 할당에 대해 알아 보겠습니다.