calloc( )
malloc과 같은 기능을 목적으로 하지만 인자 전달방식에 차이가 있습니다.
→ malloc()이 "총 120 바이트를 힙 영역에 할당해 주세요"
→ calloc()은 "4바이트 크기의 블록 30개를 힙 영역에 할당해주세요"
결과적으로 120바이트를 할당받는 것이기에 인자의 전달방식에 차이가 존재.
void *malloc(size_t size);
ex) int *arr = (int *)malloc(sizeof(int) * n);
void *calloc(size_t nelem, sizeo_t elsize);
: 할당된 메모리 0으로 초기화
void *realloc(void *ptr, size_t size);
: 이미 할당받은 메모리에 추가 메모리 할당 (이전 메모리 주소 없어짐)
void free(void * ptr);
: 할당한 메모리 해제
ex) free(arr);
초기화 값의 차이
→ malloc은 할당된 메모리 공간을 별도의 값으로 초기화하지 않아 쓰레기 값으로 채워지지만,
→ calloc 함수는 할당된 메모리 공간의 모든 비트를 0으로 초기화 한다.
#include <stdio.h>
#include <stdlib.h>
int main() {
// 크기 = 5인 배열 동적할당
// calloc()으로 사용하였기에 원소가 0으로 초기화 되어있음
int *arr = (int*) calloc(5, sizeof(int));
for(int i = 0; i < 5; i++) {
arr[i] = i+1;
printf("%d ", arr[i]);
}
free(arr);
return 0;
}
realloc( )
힙에 할당된 메모리 공간 확장 시 호출하는 realloc 함수
한번 할당된 메모리 공간은 그 크기를 확장할 수 없지만, realloc을 통해 가능
int * arr = (int *)malloc(sizeof(int) * 3); // 길이가 3인 int형 배열 할당
arr = (int *)realloc(arr, sizeof(int) * 5); // 길이가 5인 int형 배열 할당
[해석] arr이 가리키고 있는 메모리의 크기를 sizeof(int) * 5 크기로 조절
반환 결과
① malloc 함수가 반환한 주소 값과 realloc 함수가 반환한 주소 값이 같은 경우
기존에 할당된 메모리 공간의 뒤를 이어서, 확장할 영역이 넉넉한 경우
② malloc 함수가 반환한 주소 값과 realloc 함수가 반환한 주소 값이 다른 경우
공간이 넉넉하지 않은 경우, 힙의 다른 위치에 새로이 요구하는 크기의 메모리 공간을
별도로 할당해서 이전 배열에 저장된 값을 복사하여 반환
#include <stdio.h>
#include <stdlib.h>
int main() {
// 배열 크기 = 5로 동적할당
int *arr = (int*) malloc(sizeof(int)*5);
for(int i = 0; i < 5; i++) {
arr[i] = i+1;
printf("%d ", arr[i]);
}
printf("\n");
// 배열 크기 = 10로 재할당
// 메모리 변화 : 20바이트 > 40바이트
realloc(arr, sizeof(int)*10);
for(int i = 0; i < 10; i++) {
arr[i] = i+1;
printf("%d ", arr[i]);
}
free(arr);
}
'프로그래밍 언어 > C 언어' 카테고리의 다른 글
[C] 동적 할당 필요성 (0) | 2021.03.20 |
---|---|
[C] [전처리기] #ifdef (0) | 2021.03.20 |
[C] 문자열 (0) | 2021.03.20 |
[C] 배열과 문자열 관계 (0) | 2021.03.20 |
[C] 배열 선언 및 초기화 (0) | 2021.03.20 |
댓글