calloc

유제민·2025년 4월 10일

42경산

목록 보기
7/17

calloc 뭐예여

메모리를 할당하고, 0으로 초기화 해주는 함수
malloc과 차이점
malloc과 calloc은 메모리를 할당한다는 점은 같지만, malloc은 할당을 한 직후에는 쓰레기값이 들어있고, calloc은 0으로 초기화 해준다는 점이 다르다.
malloc은 size를 전체 크기 하나만 준다면, calloc은 count size (개수와 크기를 따로) 준다.
다만 malloc은 속도가 빠른 반면, calloc은 0으로 채워야하니 약간 느리다.
malloc은 오버플로우 체크를 안하지만, calloc은 오버플로우 체크를 어느정도 해서, 내부적으로 count
size가 오버플로우 나면 NULL을 반환한다.

함수 원형: void *calloc(size_t nmemb, size_t size)
size_t nmemb: number of members의 약자 count라고 보면 된다. 할당할 메모리에 몇 개를 할당할지 지정해주는 변수
size_t size: 할당할 메모리에 바이트 크기를 지정해주는 변수

ft_calloc 구현

#include "libft.h"

void	*ft_calloc(size_t nmemb, size_t size)
{
	void	*tmp;

	if (nmemb && size > SIZE_MAX / nmemb)	//오버플로우 방지
		return (NULL);
	tmp = malloc(size * nmemb);	//size * count만큼 크기 지정
	if (!tmp)
		return (NULL);
	ft_memset(tmp, 0, size * nmemb);	//memset 함수를 이용하며 할당된 메모리 내부를 0으로 채운다.
	return (tmp);
}

예외처리에 관해서

위에서 서술해놨듯이 calloc은 오버플로우 체크를 해준다.
c nmemb = 10억, size = 10억
이러한 극단적인 경우가 있다고 보자.
10억 * 10억 = 100경 바이트 -> 메모리 초과
그래서 오버플로우를 막기 위해

	if (!nmemb != 0 && size > SIZE_MAX / nmemb)	//오버플로우 방지
		return (NULL);

이 코드를 사용했는데 SIZE_MAX를 사용하기 위해서는 libft.h 헤더파일에

#include <limits.h>

를 선언해주어야한다.

profile
무진장 게으른

0개의 댓글