반응형

C언어의 메모리 구조

 

C언어의 메모리 구조

C 언어에서 대략 메모리 구조는 위와 같이 생겼다. 코드 영역(Code) 코드 영역은 실행할 프로그램의 코드가 저장되는 영역. 텍스트 영역(Text)라고도 불림. CPU는 코드 영역에 저장된 명령어를 하나

soopeach.tistory.com


데이터 영역과 스택 영역에 할당되는 메모리의 크기는 컴파일 타임에 미리 결정.

하지만 힙 영역의 크기는 프로그램이 실행되는 도중인 런타임에 사용자가 결정하게 됨.

이렇게 런타임에 메모리를 할당받는 것을 메모리의 동적 할당(dynamic allocation) 이라고 함.


malloc()

malloc() 함수는 프로그램이 실행 중일 때 사용자가 직접 힙 영역에 메모리를 할당하게 해주는 함수.

void *malloc(size_t size);

malloc() 함수는 인자로 할당받고자 하는 메모리의 크기를 바이트 단위로 전달 받음.

malloc()은 전달받은 메모리 크기에 맞고, 아직 할당되지 않은 적당한 공간을 찾음.

이렇게 찾은 공간의 첫 번째 바이트를 가리키는 주소값을 반환.

 

만약 힙 영역에 할당할 수 있는 적당한 공간이 없다면 널 포인터를 반환.

주소값을 반환받기 때문에 힙 영역에 할당된 메모리 공간으로 접근하려면 포인터를 사용해야함.

  • malloc() 함수의 원형에서 볼 수 있는 size_t 타입은 부호 없는 정수!

free()

free() 함수는 힙 영역에 할당받은 메모리 공간을 다시 운영체제로 반환해주는 함수.

 

데이터 영역이나 스택 영역에 할당되는 메모리의 크기는 컴파일 타임에 결장되어, 프로그램에 실행되는 내내 고정.

하지만 메모리의 동적 할당으로 힙 영역에 생성되는 메모리의 크기는 런 타임 내내 변환됨.

따라서 free() 함수를 사용하여 다 사용한 메모리를 해제하지 않으면, 메모리가 부족해지는 현상이 발생할 수 있음.

이처럼 사용이 끝난 메모리를 해제하지 않아서 메모리가 부족해지는 현상을 메모리 누수(Memory leak)이라고 함.

void free(void *ptr);

free() 함수는 인수로 해제하고자 하는 메모리 공간을 가리키는 포인터를 전달받음.

인수의 타입이 void형 포인터로 선언되어 있으므로, 어떠한 타입의 포인터라도 인수로 전달될 수 있음.

 


calloc()

calloc() 함수는 malloc() 함수와 마찬가지로 힙 영역에 메모리를 동적으로 할당해주는 함수.

calloc() 함수와 malloc() 함수의 차이점은 인자의 개수임.

그리고 calloc() 함수는 메모리를 할당받은 후에 해당 메모리의 모든 비트값을 전부 0으로 초기화.

calloc() 함수도 메모리를 동적으로 할당하기 때문에 free() 함수로 할당받은 메모리를 해제해야함.

void *calloc(size_t nmemb, size_t size);

calloc() 함수의 첫 번째 인수는 메모리 공간의 개수를, 두 번째 인수는 각 공간의 바이트 수를 나타냄.
따라서 calloc() 함수는 힙 영역에 size 크기의 메모리 공간을 nmemb개 할당받을 수 있도록 요청함.

 

아래의 두 코드는 동일한 기능을 수행함.

1. ptr_arr = (int*) malloc(arr_len * sizeof(int));

2. ptr_arr = (int*) calloc(arr_len, sizeof(int));

realloc()

realloc() 함수는 이미 할당된 메모리의 크기를 바꾸어 재할당할 때 사용하는 함수.

void *realloc(void *ptr, size_t size);

realloc() 함수의 첫 번째 인수는 크기를 바꾸고자 하는 메모리 공간을 가리키는 포인터를 전달받음.

두 번째 인수로는 해당 메모리 공간에 재할당할 크기를 전달함.

만약 첫 번째 인수로 NULL이 전달되면 malloc() 함수와 같은 동작을 함.


출처

http://www.tcpschool.com/c/c_memory_malloc

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기