■ calloc( )
void* calloc(size_t num, size_t size);
메모리 할당할 때 자료형의 크기(size)와 수(num)를 따로 지정하고, 모든 바이트를 0으로 초기화해주는 함수입니다.
어떤 단어의 약자인지는 의견이 분분합니다.
counted alloc...
clear alloc...
C alloc...
이 함수는 잘 사용되지 않습니다.
그 이유는 malloc()과 memset()를 조합해서 사용하면 비슷하게 구현할 수 있기 때문입니다.
memset()을 쓰면 0 외의 값으로도 초기화 가능한데 좀 더 자세한 점은 아래에서 다루겠습니다
■ memset()
void* memset(void* dest, int ch, size_t count);
memory + set, 메모리를 어떤 값으로 설정하는 함수입니다.
시작 위치(dest)부터 카운트(count) 바이트만큼 지정 값(ch)으로 초기화합니다.
지정한 값으로 유연하게 초기화할 수 있어 malloc은 memset와 자주 사용합니다.
<string.h> 에 있습니다.
char로 1바이트씩 초기화됩니다.
그 외의 자료형으로 초기화하려면 직접 for 문을 써야하는데, 다음과 같은 경우에는 결과가 정의되지 않습니다.
- count가 dest 의 영역을 넘어설 경우 (소유하지 않은 메모리 쓰기)
- dest가 NULL 포인터일 경우 (널 포인터 역참조)
calloc() | malloc() + memset() |
void* nums;
nums= calloc(LENGTH, sizeof(int));
free(nums); nums= NULL; |
void* nums;
nums= malloc(LENGTH * sizeof(int)); |
■ realloc( )
void* realloc(void* ptr, size_t new_size);
이미 존재하는 메모리(ptr)의 크기를 new_size 바이트로 변경합니다.
따라서 이 함수는 동적 배열 크기를 늘리거나 줄이는데 활용할 수 있습니다.
새로운 크기가 허용하는 한 기존 데이터를 그대로 유지할 수 있지만,
크기를 늘린다고 할 때 두 가지 경우가 발생할 수 있습니다.
1 지금 갖고 있는 메모리 뒤에 충분한 공간이 없으면 새로운 메모리를 할당한 뒤, 기존 내용을 복사하고 새 주소 반환
2 지금 갖고 있는 메모리 뒤에 공간이 충분하다면 그냥 기존 주소를 반환하고(보장 없음) 추가된 공간을 사용
크기가 작아질 때도 비슷합니다.
'컴퓨터 공학 > C, C++' 카테고리의 다른 글
[ C ] 메모리 이해하기10 _정적 vs 동적 메모리 (398) | 2020.07.17 |
---|---|
[ C ] 메모리 이해하기9 _realloc()의 메모리 누수 문제, 해결책은? (398) | 2020.07.16 |
[ C ] 메모리 이해하기7 _malloc 짝꿍 함수 free 란? (389) | 2020.07.16 |
[ C ] 메모리 이해하기6 _동적메모리란? / 동적 할당 개념 그림으로 이해하기 (395) | 2020.07.15 |
[ C ] 메모리 이해하기5_힙(heap) 메모리란? (395) | 2020.07.15 |
댓글