cs50 6강 malloc복습 및 배열 크기 조절하기
malloc 활용하기
int main(void)
{
int *x;
int *y;
x = malloc(sizeof(int));
*x = 42;
*y = 13;
}
위 코드는 네이버 부스트 코스에서 일부로 제출한 문제 있는 코드이다.
여기에는 크게 두 개의 문제점이 있는데 그 부분에 대해 공부해보도록 하자.
메모리 해제하기
malloc을 통해 할당을 한 뒤에는 힙 영역의 메모리를 동적으로 조절해주기 위하여 free를 꼭 해주어야한다.
그렇지 않으면 힙 오버플로우가 발생할 수도 있기 때문인데, 위 작업은 변수의 사용이 온전히 끝난 뒤에 진행해주어야한다.
따라서 x에 대한 사용이 끝났다면 free를 추가해주면 된다.
초기화
모든 지역변수는 초기화의 절차를 거쳐야한다.
그렇지 않으면 쓰레기 값이 들어가거나 오류를 일으킬 수도 있기 때문인데, 이는 포인터 변수에도 동일하게 적용된다.
포인터 변수를 초기화 할 때에는, 특정 주소값을 꼭 할당해야하는 상황이 아니라면 NULL
을 사용해서 선언시에 초기화해주면 된다.
위에 코드의 경우 int *x=NULL
로 초기화를 한 뒤 사용하면 되는 것이다.
수정 코드
#include <stdlib.h>
int main(void)
{
int *x = malloc(sizeof(int));
int *y = malloc(sizeof(int));
if (x == NULL || y == NULL) {
// 메모리 할당 실패 처리
return 1;
}
*x = 42;
*y = 13;
// x에 대한 사용이 끝났으므로 메모리 해제
free(x);
// y에 대한 사용이 끝났으므로 메모리 해제
free(y);
return 0;
}
배열의 크기
c언어에서는 메모리를 효율적으로 쓰는 것이 중요하다는 것을 이제 모든 사람들이 알게 되었을 것이다.
그렇다면 메모리를 효율적으로 관리하는 구체적인 방법은 어떤 것이 있을까?
그중 하나는 바로 배열을 사용할 때에 malloc과 realloc를 적절하게 활용하는 것이다.
강의에서는 주로 이 둘의 사용법만 나왔으나, 내가 예전에 보았던 책에서는 배열 내의 저장된 데이터가 반절도 되지 않는다면 malloc을 통해 메모리를 다시 할당하는 등의 방법을 통해 메모리를 극악적으로 조절하는 방법도 소개를 해주었었다.
realloc
malloc과 calloc에 대해서는 앞선 장에서 미리 공부하고 넘어갔는데, realloc는 과연 무엇일까?
이름에서도 알 수 있듯 re즉 재할당을 진행하여주는 함수이다.
사용법
realloc(이미 할당된 포인터 변수, size_t)의 형태로 총 2개의 인자를 가지고 있다.
참고로 realloc에 들어간 ptr이 NULL인 경우 malloc과 똑같이 작동한다.
또한 메모리의 할당 실패시 NULL
을 반환하니, 메모리의 할당 성공여부를 알고싶다면, 이 포인터가 NULL인지 아닌지를 검사하면 된다.
메모리를 절약하는 또다른 방법
c언어에는 short와 같이 독특한 자료형들이 몇개 있다.
따라서 이런 자료형들을 활용함으로써 메모리를 절약하는 방법도 존재한다.
또한 할당과 해제를 제때제떄 잘 해주는 것 역시 간단하면서도 메모리를 직접적으로 조절가능한 방법 중에 하나이다.
댓글남기기