힙 영역 : 사용자가 원하는 시점에 변수를 할당/소멸 하도록 지원. '프로그래머가 관리하는 메모리 공간'이라고도 하는데, malloc 함수 호출로 할당된 메모리 공간은 프로그래머가 직접 free 함수 호출을 통해 해제하지 않으면 계속 남아있다.

지역변수와 같이 함수가 호출될 때마다 매번 할당이 이뤄지지만, 할당이 되면 전역변수와 마찬가지로 함수를 빠져나가도 소멸되지 않는 성격의 변수가 필요. 힙에 할당된 메모리 공간은 포인터 변수를 이용해서 접근해야 한다. 주소 값을 반환하기 때문.


힙 영역의 메모리 공간 할당과 해제 : malloc, free 함수

1
2
3
4
#include <stdlib.h>
 
void * malloc (size_t size);
void free (void * ptr);


malloc 함수는 성공 시 할당된 메모리의 주소 값 반환, 실패 시 NULL 반환


malloc 함수의 반환형은 void * 형이므로 반환값에 아무런 가공도 하지 않으면 할당된 메모리 공간에 접근 불가능.

malloc 함수는 원하는 만큼 메모리 공간 할당하고, 그 메모리의 주소 값 반환. 사용하려면 포인터 형의 변환을 통해 결정해야 함.

형변환 연산자를 사용하여 int * ptr1 = (int *)malloc(sizeof(int)); 이런 식으로 형변환을 해줘야 할당된 메모리 공간에 접근 가능.


힙 영역의 메모리 공간 할당 함수 : calloc 함수 (메모리 공간 해제시 free)

1
2
3
#include <stdlib.h>
 
void * calloc (size_t elt_count, size_t elt_size);


성공 시 할당된 메모리의 주소값, 실패 시 NULL 반환

elt_count 인자 : 할당할 블록의 개수 정보

elt_size 인자 : 블록 하나당 바이트 크기의 정보

malloc 함수와 차이점 : malloc는 할당된 메모리 공간을 별도의 값으로 초기화하지 않음(할당된 메모리 공간이 쓰레기 값으로 채워짐), calloc는 할당된 메모리 공간의 모든 비트를 0으로 초기화 시킴.


힙에 할당된 메모리 공간 확장 시 호출하는 realloc 함수

할당된 메모리 공간은 크기를 확장할 수 없지만, 그 영역이 heap이라면 가능하다.

1
2
3
#include <stdio.h>
 
void * realloc (void * ptr, size_t size);


성공 시 새로 할당된 메모리의 주소 값, 실패 시 NULL 반환

ptr : 확장하고자 하는 힙 메모리의 시작 주소 값

size : 확장하고자 하는 메모리의 전체 크기

1. malloc 함수의 반환 값(주소값)과 realloc 함수의 반환 값이 같은 경우

=> 기존에 할당된 메모리 공간의 뒤를 이어서 확장할 영역이 넉넉한 경우

2. malloc 함수의 반환 값과 realloc 함수의 반환 값이 다른 경우

=> 넉넉하지 않은 경우 힙의 다른 위치에 새로 할당(이전 배열에 저장된 값 복사)

'언어 > C' 카테고리의 다른 글

typedef  (0) 2016.05.02
static 변수  (0) 2016.03.21
파일 입출력 -3  (0) 2016.03.18
파일 입출력 -2  (0) 2016.03.13
파일 입출력 -1  (0) 2016.03.10
Posted by 知彼知己百戰不殆
,