Written by coh at home

동적메모리 본문

languages/c

동적메모리

och 2022. 3. 24. 15:07

동적 메모리가 필요한 다음과 같은 상황을 생각해보자.

 

우리가 어떤 배열을 쓸 것인데

이 배열의 크기를 우리가 변수로 지정해서 필요한 만큼만 쓰고 싶을 때.

 

근데 지금까지는 배열의 크기를 변수로 지정하는 것은 불가능했다. 

왜냐면 변수의 크기는 stack memory에 올라갈 때 (stack frame or block)

결정되는데 배열의 크기는 컴파일 되는 시점에 결정되어야 memory를 할당할 수 있기 때문.

 

프로그램 실행 중에 사용자의 필요에 따라 메모리 크기를 결정하고 싶어서 이제부터 heap memory에 접근하게 된다.

 

 

문법은 다음과 같다.

void* malloc(size_t size)

heap영역에 size만큼 연속된 메모리 공간을 할당하게 되고 처음에 garbage값이 들어있다. 

parameter는 byte단위로 크기를 지정하고 

return value는 할당된 메모리 시작 주소를 의미한다. 

 

이러한 dynamic memory는 반드시 사용후에 해지를 해주어야 한다. 안 그러면 memory leakage가 발생한다. 

void free(void* ptr)

할당해준 메모리의 시작주소를 넣어주면 해지를 해준다. 

 

 

사용 시의 주의 사항은 다음과 같다. 

1. 할당된 공간을 넘어서지 않도록 주의할 것.

실행 중에 메모리 공간을 얼마나 사용할지 결정하기 때문에 compile할 당시 error가 안 잡힌다. 

overflow를 발생시켜 메모리를 덮어쓰게 되면 치명적인 오류를 발생시킬 수 있다. 

 

2. 사용 후 반드시 free()로 해지해주기

 

3.dangling pointer

free()후에 사용한 포인터도 NULL값으로 초기화 해주기

 

4.동적메모리 초기화 해주기

void* calloc(size_t number, size_t size)
void* memset(void* dest, int c, size_t count)

calloc은 할당된 memory공간을 모두 0으로 초기화

parameter는 순서대로 elements 갯수, elements 크기

 

memset은 할당된 메모리는 원하는 값으로 초기화

parameter는 순서대로 시작주소, 채워줄 값, 채워줄 공간의 크기

'languages > c' 카테고리의 다른 글

보물지도 찾기.  (0) 2022.03.31
c언어 data filter 만들기  (0) 2022.03.29
동적메모리 예제  (0) 2022.03.25
정적 메모리 예제  (0) 2022.03.24
.c file I/O studentDB.bin  (0) 2022.03.23