본문 바로가기
컴퓨터 공학/C, C++

[ C ] 메모리 이해하기8 _calloc(), memset(), realloc()

by hahehohoo 2020. 7. 16.
반응형

 

 

 

■ 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));
memset(nums, 0, LENGTH *  sizeof(int));

free(nums);
nums = NULL;

 

 


 

■ realloc( )

void* realloc(void* ptr, size_t new_size);

 

이미 존재하는 메모리(ptr)의 크기를 new_size 바이트로 변경합니다.

따라서 이 함수는 동적 배열 크기를 늘리거나 줄이는데 활용할 수 있습니다. 

 

새로운 크기가 허용하는 한 기존 데이터를 그대로 유지할 수 있지만,

크기를 늘린다고 할 때 두 가지 경우가 발생할 수 있습니다.

1 지금 갖고 있는 메모리 뒤에 충분한 공간이 없으면 새로운 메모리를 할당한 뒤, 기존 내용을 복사하고 새 주소 반환

2 지금 갖고 있는 메모리 뒤에 공간이 충분하다면 그냥 기존 주소를 반환하고(보장 없음) 추가된 공간을 사용

 

크기가 작아질 때도 비슷합니다.

 

 

 

 

반응형


댓글