스택(stack)
메모리의 스택 영역은 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역이다.
스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다
이렇게 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라고 한다.
스택 프레임(stack frame)
함수가 호출되면 스택에는 함수의 매개변수, 호출이 끝난 뒤 돌아갈 반환 주소값, 함수에서 선언된 지역 변수 등이 저장된다. 이렇게 스택 영역에 차례대로 저장되는 함수의 호출 정보를 스택 프레임 이라고 한다.
힙(heap)
메모리의 힙 영역은 사용자가 직접 관리할 수 있는 메모리 영역이다.
힙 영역에서 사용자에 의해 메모리 공간이 동적으로 할당되고 해제되며 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.
메모리 동적 할당
데이터 영역과 스택 영역에서 할당되는 메모리의 크기는 컴파일 타임에 미리 결정된다. 하지만 힙 영역의 크기는 프로그램이 실행되는 도중인 런 타임(run time)에 사용자가 직접 결정한다. 이렇게 런 타임에 메모리를 할당받는 것을 메모리의 동적 할당이라고 한다.
malloc()
malloc() 함수는 프로그램이 실행 중일 때, 사용자가 힙 영역에 메모리를 할당할 수 있게 해준다. 메모리의 크기를 바이트 단위로 전달받으며, 전달받은 메모리 크기에 맞고, 아직 할당되지 않은 적당한 블록을 찾는다.
이렇게 찾은 블록의 첫 번째 바이트를 가리키는 주소값을 반환한다. 힙 영역에 할당할 수 있는 적당한 블록이 없을 경우, 널 포인터를 반환한다. 주소값을 반환받기 때문에 힙 영역에 할당된 메모리 공간으로 접근하려면 포인터를 사용해야 한다.
free()
free() 함수는 힙 영역에 할당받은 메모리 공간을 다시 운영체제로 반환해 주는 함수이다.
데이터 영역이나 스택 영역에 할당되는 메모리의 크기는 컴파일 타임에 결정되며, 프로그램이 실행되는 내낸 고정된다.
하지만 메모리의 동적 할당으로 힙 영역에 생성되는 메모리의 크기는 런 타임 내내 변화된다.
calloc()
calloc() 함수는 malloc() 함수와 마찬가지로 힙 영역에 메모리를 동적으로 할당해주는 함수이다.
이 함수가 malloc() 함수와 다른 점은 할당하고자 하는 메모리의 크기를 두 개의 인수로 나누어 전달받는 점이다.
또한, calloc() 함수는 메모리를 할당받은 후에 해당 메모리의 모든 비트값을 전부 0으로 초기화해 준다.
calloc() 함수도 malloc() 함수와 마찬가지로 free() 함수를 통해 할당받은 메모리를 해제해 주어야 한다.
realloc()
realloc() 함수는 이미 할당된 메모리의 크기를 바꿔 재할당할 때 사용하는 함수이다.
출처: http://www.tcpschool.com/c/c_memory_structure