[C] 동적 메모리
메모리를 동적으로 할당받을 때 malloc외에도 realloc, xalloc, calloc 등 alloc의 가족들이 있다. 하나 하나 살펴보자.
calloc
calloc은 인자 전달 방식과 메모리를 0으로 초기화하는 부분 말고는 malloc과 동일하다.
int *p = (int*)calloc(24, sizeof(int));
int *p = (int*)malloc(sizeof(int)* 24);
두 문장은 같은 역할을 한다.
realloc
int *p = (int*)malloc(3 * sizeof(int));
int *np = (int*)realloc(p, 5*sizeof(int));
realloc은 원래 사용하던 공간을 최대한 재활용하는 방향으로 메모리를 확보한다.
이전 포인터 p근처 공간이 넉넉하면 주위의 메모리를 좀 더 확보한 후 p를 그대로 리턴하고, 공간이 부족하다면 새로운 공간을 확보한 후 p내용을 복사 후 새로운 주소를 리턴한다.
미루어 짐작할 수 있듯, 스택 메모리의 포인터에 대해서는 realloc을 사용할 수 없다.
스택 메모리에 할당된 포인터를 배열로 사용할 수 있듯, malloc을 통해 힙 메모리에 할당된 포인터 또한 형변환을 적절히 해준 다음에는 배열로 사용할 수 있다. 역시, 배열의 이름은 포인터다.
malloc을 사용해서 얻는 이점 중 하나는 배열의 크기를 자유롭게 지정할 수 있다는 점이다.
항상 크기를 넉넉하게 잡고 필요한 만큼만 가져다 썼지만..
int[] arr = new int[5]; 자바에서 이렇게 쓰듯, (int*)malloc(sizeof(int)*n) 으로 이제는 동적 크기의 배열을 사용할 수 있다.
(기존에 int arr[n] 은 오류.)
free로 버린 메모리조각을 포인터변수가 참조하고 있을 때, 이 포인터변수를 dangling Pointer라고 부른다.
비슷한 문제로, malloc으로 메모리를 할당해놓고 메모리에 접근할 수 있는 경로를 지워버리면 memory leak이 발생한다.
포인터를 사용하다 보면 위와 같은 문제가 발생하기 쉬우니, 포인터를 다룰 때는 항상 주의하자.
'Programming Language > C' 카테고리의 다른 글
[C] typedef / Union (0) | 2022.05.26 |
---|---|
[C] 구조체 (0) | 2022.05.26 |
[C] Stack / Heap (0) | 2022.05.23 |
[C] 배열 포인터 / 포인터 배열 정리 (0) | 2022.05.11 |
[C] 배열의 포인터 (0) | 2022.05.01 |
댓글
이 글 공유하기
다른 글
-
[C] typedef / Union
[C] typedef / Union
2022.05.26 -
[C] 구조체
[C] 구조체
2022.05.26 -
[C] Stack / Heap
[C] Stack / Heap
2022.05.23 -
[C] 배열 포인터 / 포인터 배열 정리
[C] 배열 포인터 / 포인터 배열 정리
2022.05.11