malloc
동적으로 메모리를 할당하는 함수
#include <stdlib.h>
void* malloc(size_t size)
메모리 크기를 바이트 단위로 넘기면 그 크기만큼 메모리가 할당되고 할당된 메모리의 첫 번째 바이트의 주소가 반환된다.
메모리 할당에 실패할 경우 NULL이 반환된다.
개발자가 어떤 데이터 형으로 저장하는지 알 수 없기 때문에 void* 형을 반환하고, 개발자는 사용 용도에 맞게 변환하여야 한다.
malloc 함수 사용 예시
#include <stdio.h>
#include <stdlib.h>
int main()
{
int arr[10];
int* arr_ptr;
for(int i = 0; i < 10; ++i)
{
arr[i] = i;
}
arr_ptr = (int*)malloc(sizeof(int)*10); // 배열의 크기만큼 할당하기 위해 배열의 요소 크기만큼 곱함
for(int i = 0; i < 10; ++i)
{
arr_ptr[i] = arr[i];
printf("%d", arr_ptr[i]);
}
return 0;
}
calloc
malloc 함수와 기능은 같되 사용법이 다르다. 변수의 크기를 n개만큼 할당해달라고 지정할 수 있다.
#include <stdlib.h>
void* calloc(size_t elt_count, size_t elt_size)
malloc 함수는 메모리를 할당할 때 메모리 공간의 값을 바꾸지 않지만
calloc 함수는 메모리 공간의 값을 0으로 초기화 시킨다.
calloc 함수 사용 예시
#include <stdio.h>
#include <stdlib.h>
int main()
{
int arr[10];
int* arr_ptr;
for(int i = 0; i < 10; ++i)
{
arr[i] = i;
}
arr_ptr = (int*)calloc(10, sizeof(int)); // int 형의 변수를 10개 저장할 수 있는 메모리 할당
for(int i = 0; i < 10; ++i)
{
arr_ptr[i] = arr[i];
printf("%d", arr_ptr[i]);
}
return 0;
}
realloc
이미 할당된 메모리의 크기를 바꿀 때 사용하는 함수
#include <stdlib.h>
void* realloc(void* memblock, size_t size)
메모리 크기를 바꿀 포인터와 할당할 크기를 넘겨 사용한다.
realloc 함수 사용 예시
#include <stdio.h>
#include <stdlib.h>
int main()
{
int arr[10];
int* arr_ptr;
for(int i = 0; i < 10; ++i)
{
arr[i] = i;
}
arr_ptr = (int*)calloc(5, sizeof(int)); // 일단 5개가 들어갈 공간만 할당
for(int i = 0; i < 5; ++i)
{
arr_ptr[i] = arr[i];
printf("%d", arr_ptr[i]);
}
(int*)realloc(arr_ptr, 10); // int 형 변수 10개가 들어갈 공간만큼 재할당
for(int i = 0; i < 10; ++i)
{
arr_ptr[i] = arr[i];
printf("%d", arr_ptr);
}
return 0;
}
realloc 함수를 사용할 때 주의할 점이 있는데 메모리 할당에 실패했을 때 NULL이 반환되기 때문에 기존의 메모리가 할당되어 있던 포인터를 잃어버릴 수 있다. 그렇게 되면 기존에 할당된 메모리를 해제할 수 없게되어 메모리 누수로 이어진다.
free
할당된 메모리를 해제하는 함수. 더이상 사용하지 않는 메모리라면 해제해줘야 메모리가 부족하지 않다.
#include <stdlib.h>
void free(void* ptr)
free 함수 사용 예시
#include <stdio.h>
#include <stdlib.h>
int main()
{
int arr[10];
int* arr_ptr;
for(int i = 0; i < 10; ++i)
{
arr[i] = i;
}
arr_ptr = (int*)calloc(10, sizeof(int));
for(int i = 0; i < 10; ++i)
{
arr_ptr[i] = arr[i];
printf("%d", arr_ptr[i]);
}
free(arr_ptr); // 메모리 해제
return 0;
}
'c++' 카테고리의 다른 글
[C++] 객체 지향 프로그래밍(OOP, Object Oriented Programming) (0) | 2023.06.08 |
---|---|
[C++] Call by value, Call by reference (0) | 2023.06.07 |
[C++] 객체 생성 시 초기화 (0) | 2023.06.07 |
[C++] 메모리 동적 할당 및 해제 - new, delete (0) | 2023.06.07 |
[C++] 메모리 구조 - Code, Data, Stack, Heap (0) | 2023.06.07 |
댓글