반응형
동적할당 이란?
- 동적할당 : 프로그램이 실행되는 중에 메모리를 할당하는 것을 가리켜 메모리를 동적으로 할당한다 라고 말합니다.
- 프로그램에서 사용할 데이터의 크기를 미리 확정하지 못할 경우, 필요에 따라 메모리를 동적할당 하여 데이터를 저장할 수 있습니다.
- c 언어는 메모리를 동적할당 하여 사용하고 난 후 직접 해제해 주어야 합니다.
함수 소개
void *malloc(size_t size);
- 매개변수
- size : 동적으로 할당하고 싶은 메모리 크기를 지정합니다. 단위는 바이트 입니다.
- 반환값
- 동적 할당에 성공하면 할당된 메모리의 시작 주소를 반환합니다. 실패하면 NULL을 반환합니다. 반환받은 주소는 필요에 따라 다른 포인터 형식으로 변환하여 저장할 수 있습니다.
void *calloc(size_t number, size_t size);
- 개요
- malloc 함수처럼 메모리 동적할당 함수이지만, 매개변수로 받는 정보들을 가지고 메모리를 0으로 초기화 해준다는 특징이 있습니다. 이러한 특징은 배열을 할당할 때 유용합니다. 배열은 할당 후 0으로 초기화 해야하는 경우가 많기 때문입니다
- 매개변수
- number : 요소의 개수 입니다.
- size : 요소의 크기 입니다.
- 반환값
- 동적 할당에 성공하면 할당된 메모리의 시작 주소를 반환합니다. 실패하면 NULL을 반환합니다. 반환받은 주소는 필요에 따라 다른 포인터 형식으로 변환하여 저장할 수 있습니다.
void *realloc(void *memblock, size_t size);
- 개요
- 기존에 할당받은 메모리의 크기를 재조정합니다. 크기를 더 늘려야 할 필요가 있을 때 사용되곤 합니다. 사용하던 메모리를 조금 덜 사용할 때는, 재조정 하기보다 그냥 사용하지 않고 두었다가 사용이 완전히 끝나고 한번에 모든 메모리를 해제합니다.
- 매개변수
- memblock : 이전에 할당했던 메모리의 시작 주소입니다.
- size : 새로 재조정 하고자 하는 메모리의 크기 입니다. 단위는 바이트 입니다.
- 반환값
- 성공 시 재조정된 메모리의 시작주소를 반환합니다. 실패 시 NULL을 반환합니다. 반환받은 주소는 필요에 따라 다른 포인터 형식으로 변환하여 저장할 수 있습니다.
void free(void *memblock);
- 개요
- 할당받은 메모리를 해제합니다. c언어 프로그램은 실행 중 할당받은 메모리가 자동으로 해제되지 않습니다. 메모리 낭비를 막기 위해서는 프로그래머가 메모리를 잘 관리해야 합니다.
- 매개변수
- memblock : 해제할 메모리의 시작주소 입니다.
- 주의
- 할당되지 않은 공간을 해제하면 프로그램이 비정상 종료 되므로 잘 따져서 해제해야 합니다.
사용 예시
malloc 함수 사용예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#include <stdio.h>
#include <malloc.h>
int main()
{
int *p_data;
p_data = (int*)malloc(sizeof(int) * 1);
// malloc 가 성공했는지 확인한다.
if (p_data != NULL) {
// 여기서 p_data를 사용한다.
*p_data = 10;
printf("%d", *p_data);
// malloc 함수로 메모리 할당에 성공한 경우에만
// free함수를 호출하여 메모리를해제한다.
free(p_data);
}
return 0;
}
|
calloc 함수 사용 예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
#include <stdio.h>
#include <malloc.h>
int main()
{
int *p_data;
// int data[10] 배열을 동적할당하고
// 0으로 초기화 한 것과 같다.
p_data = (int*)calloc(10, sizeof(int));
// 동적할당이 성공했는지 확인한다.
if (p_data != NULL) {
// 할당받은 공간을 출력하여
// 0으로 초기화 되었는지 확인한다.
for (int i = 0; i < 10; i++) {
printf("%d ", p_data[i]);
}
// 동적할당 메모리를 해제한다.
free(p_data);
}
return 0;
}
|
realloc 함수 사용 예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
#include <stdio.h>
#include <malloc.h>
int main()
{
int *p_data;
p_data = (int*)malloc(sizeof(int) * 3);
// 동적할당이 성공했는지 확인한다.
if (p_data == NULL) {
return 0;
}
int dyn_alloc_size = _msize(p_data);
printf("malloc size: %d\n", dyn_alloc_size);
// realloc 함수가 실패할 경우 p_data에 NULL이 들어가며
// 기존에 할당받았던 메모리의 주소를 잃게 된다.
// 그것을 막기 위해 기존 주소를 p_old에 저장해 둔다.
int *p_old = p_data;
p_data = (int *)realloc(p_data, sizeof(int) * 5);
if (p_data != NULL) {
// 할당받은 공간의 사이즈를 확인하여 출력한다.
dyn_alloc_size = _msize(p_data);
printf("realloc size: %d\n", dyn_alloc_size);
// 동적할당 메모리를 해제한다.
free(p_data);
}
else {
free(p_old);
}
return 0;
}
|
반응형
'개발지식 > c c++' 카테고리의 다른 글
[c/c++] 난수 값 만들기 rand srand time 함수 활용 (0) | 2024.10.28 |
---|---|
[c/c++] strcmp strncmp 문자열 비교 함수 예시와 차이 (0) | 2024.10.17 |
[c++] 숫자 분리자 digit separator 사용하여 긴 숫자 쉽게 읽기 (1) | 2024.10.14 |