오늘은! 메모리 구조 heap영역에 대해서 같이 공부해보자.
메모리 구조의 heap영역은 우리가 직접 관리할 수 있는 영역이다. 우리에 의해서 메모리 공간이 동적으로 할당되고 해제된다.
데이터 영역과 스택 영역은 메모리 공간이 compile time에 정해지는데, heap영역은 runtime에 사용자가 직접 정한다. 이렇게 runtime에 메모리 공간 할당받는 것을 메모리의 동적 할당(dynamic allocation)이라고 한다.(반대는 정적 할당 static allocation)
동적 할당을 위해서 알아야 할 함수는 malloc과 free이다.
*malloc (MemoryAllocation)
malloc은 프로그램이 실행 중일 때 힙 영역에 메모리 할당을 할 수 있게 해 준다. malloc함수를 사용하기 위해선 헤더 파일 #includ <stdlib.h>을 선언해줘야 한다.
위 예시에서는 numPtr1과 numPtr2를 선언하고 1에는 일반 변수의 메모리를, 2에는 malloc함수로 메모리를 할당했다.
이 주소는 같은곳에 저장되는 것이 아닌 스택과 힙 두 가지에 각각 저장이 된다. 일반 변수는 stack에 저장이 되고, malloc함수로 동적 할당한 numPtr2의 메모리 주소는 heap에 저장이 된다.
free(numPtr2); 는 메모리 해제과정이다. 메모리를 할당만 하고 해제해주지않는다면 시스템의 메모리가 부족해지는 경우가 발생할 수 있다. 메모리를 해제하지 않게 되면 메모리 사용량이 증가해 메모리 누수현상(memory leak)이 발생한다.
그렇다면 동적할당은 왜 그리고 언제 쓰는 걸까?
예를 들어 학교 학급 학생들의 키를 조사받아 키 평균을 구하는 프로그램을 만든다고 가정해보자. 이 경우 학급마다 학생 수도 다르고 중간에 전학을 가거나 올 가능성이 있기 때문에 배열의 크기를 정하기 애매해진다. "그러면 배열의 크기를 넉넉하게 잡아놓으면 되는 거 아니야?"라고 생각할 수도 있다. 물론 맞다. 하지만 배열을 넉넉하게 잡는다면 사용하지 않는 메모리조차 쓰는 것이기 때문에 메모리가 낭비되는 경우가 생긴다. 메모리 낭비를 방지하기 위해 우리는 메모리 동적 할당을 사용한다. 말 그대로 메모리를 동적으로 할당하는 것이다. 학생수를 입력하면 그 학생수만큼의 공간이 생기게 할 수 있다는 말이다.
위는 학생수를 입력하면 메모리가 입력한 만큼만 할당되는 모습이다.
다음에는 2차원 배열에 동적 할당을 배워보자
끗
'C' 카테고리의 다른 글
20201103#(8) 지역변수와 메모리 구조? (0) | 2020.11.03 |
---|---|
20201101#(7) 메모리구조 (3) (전역변수,static) (0) | 2020.11.01 |
20201031#(6) 메모리구조 (2) (stack) (0) | 2020.10.28 |
20201026#(4) 메모리구조 (1) (0) | 2020.10.26 |