상세 컨텐츠

본문 제목

[C] 동적 메모리 할당

개발공부/C

by 임우찬 2019. 9. 11. 11:22

본문

 

 

https://dlaxodud2388.tistory.com/14

우선, 이 글의 4번 내용에서 4가지 영역들에 대해 설명을 했었다.

이 때, 4가지 영역 중 HIP 영역에 대해서 동적 메모리 할당과 관련이 있다고 했었다.

동적 메모리 할당이란, 프로그램이 실행 도중에 동적으로 메모리를 할당받는 것을 말한다. 프로그램에서는 필요한 만큼의 메모리를 시스템으로부터 할당을 받아 사용하고, 사용이 끝나면 시스템에 메모리를 반납해야 한다. 필요한 만큼만 할당을 받고 또 필요한 때에 사용하고 반납해 메모리를 효율적으로 사용할 수 있는 것이다.

동적 메모리는 일종의 물건 빌려가는 곳에서 물건을 빌려가는 것과 비슷하다고 생각하면 된다. 물건을 빌려가서 다 쓰고 다시 돌려줘야 하는 것처럼, 메모리도 빌려갔다가 다 쓰고 다시 돌려줘야 한다. 이 hip 영역에서 메모리를 빌려오고, 다 사용하면 다시 돌려놓는다.

다시 말하면, 동적 메모리의 사용이 끝나면 반드시 그 메모리의 영역을 명시적으로 반납해야 한다는 말이다.

동적 메모리 할당의 예시를 들겠다.

#include<stdio.h>
#include<stdlib.h>
void main() {
int* p = NULL; p = (int*)malloc(sizeof(int)); //malloc으로 메모리 할당
if (p == NULL) {
printf("동적 메모리 할당 실패");
exit(1);
}
*p = 321; printf("%d", *p);
free(p); //동적 메모리 사용 후 메모리 반환
}
// 출력값 : 321

우선 int *p를 통하여 포인터변수 p를 선언했다.

동적으로 할당된 메모리를 사용하기 위해선, 힙 영역에 할당된 메모리의 시작 번지를 알아야 하므로 반드시 포인터 변수가 필요하다.

malloc 코드는 메모리를 할당해주는 코드이고, 그 안의 괄호값은 얼마만큼의 메모리를 할당할까에 대한 코드이다. int형이 4바이트이므로 저 괄호 안의 값을 4라고 해도 되겠지만, int가 항상 4바이트라는 보장이 없으므로, 여기 안에도 sizeof로 크기 계산을 해주는 것이 좋다.

malloc 앞에 (int*)로 형변환을 해주었다.

이 형변환을 해 주는 이유는, malloc 함수는 메모리만 확보하여 사용할 수 있게 해주는데, 그 안에 어떤 타입의 자료가 저장될 지 정해지지 않았기 때문에 void* 타입을 반환하기 때문이다.

이렇게 된다면, 저장될 타입이 미정인 메모리의 주소를 반환하는 것이기 때문에 저장할 타입에 맞춰 형변환을 해 주어야 한다.

이후 if안의 코드는, 포인터변수 안에 변수값으로 주소가 할당이 되지 않았을 경우 exit(1); 코드를 통하여 프로그램을 종료시킨다.

*p = 321;을 하고 *p를 출력하였으므로, 출력값이 321이 나오는 것은 일단 당연하다.

이후 free(p) 를 통해서 반드시 사용한 메모리를 반환해 주어야 한다.

동적 메모리 할당을 사용하고 나면, 메모리 반환은 필수적이다.

위 코드를 그림으로 다시 알아보자.

이와 같은 형태로 동적 메모리 할당을 사용한다.

'개발공부 > C' 카테고리의 다른 글

[C] 포인터(2)  (0) 2019.09.11
[C] 포인터(1)  (0) 2019.09.11

관련글 더보기

댓글 영역