malloc ()과 calloc () 함수를 이해하기 전에 먼저 동적 메모리 할당의 의미를 이해하게하십시오. 메모리 할당 은 프로그램 및 프로세스의 실행을 위해 컴퓨터 메모리를 할당하는 절차입니다. 프로그램과 프로세스에 필요한 메모리 공간이 얼마인지 알 수 없을 때 동적 할당 기술을 사용합니다.
정적 메모리 할당과 관련된 문제로 인해 동적 메모리 할당이 발생합니다. 예를 들어 더 적은 수의 요소가 저장되면 나머지 메모리는 불필요하게 낭비됩니다. 따라서 메모리가 필요할 때만 할당되는 정적 메모리 할당 문제를 극복합니다.
비교 차트
비교의 기초 | malloc () | calloc () |
---|---|---|
블록 수 | 요청 된 메모리의 단일 블록을 할당합니다. | 요청 된 메모리의 여러 블록을 할당합니다. |
통사론 | void * malloc (size_t size); | void * calloc (size_t num, size_t size); |
초기화 | malloc ()은 할당 된 메모리를 초기화하지 않습니다. | 할당 된 메모리는 calloc ()을 사용하여 0으로 초기화됩니다. |
배분 방식 | malloc () 함수는 힙에서 '크기'크기의 메모리를 할당합니다. | calloc () 함수는 크기가 num * size 인 메모리를 할당합니다. |
속도 | 빠른 | 비교적 천천히. |
malloc ()의 정의
malloc 함수 는 메모리 블록을 바이트 단위로 할당 합니다 . 사용자는 명시 적으로 블록 크기를 지정해야하며, 사용하려면 블록 크기를 지정해야합니다.
malloc 함수 프로그램은 메모리 할당을 위해 시스템의 RAM을 요청하고, 요청이 승인되면 (즉, malloc 함수는 메모리를 할당하는 데 성공했다고 말함) 메모리의 첫 번째 블록에 대한 포인터를 반환합니다. 그것은 void 타입 의 포인터를 반환하는데, 이는 모든 유형의 포인터가 할당 될 수 있음을 의미합니다.
비록 malloc 함수가 필요한 양의 메모리를 할당 할 수 없다면 NULL을 반환합니다. malloc 함수는 TURBO C, 헤더 파일 인 alloc.h
또는 stdlib.h
에서 액세스 할 수 있으며 UNIX에서는 헤더 파일에서 사용할 수 있습니다 .
통사론
이 함수의 구문은 다음과 같습니다.
malloc(number of elements * size of each element);
예를 들어, int *ptr;
ptr=malloc(10*sizeof (int))
여기서 size는 필요한 메모리 크기 (바이트 단위)를 나타냅니다 (즉, 할당 할 연속 메모리 위치의 수).
그러나 앞에서 언급했듯이 malloc 함수는 무효 포인터를 반환하므로 필요에 따라 반환 된 포인터 유형을 변경하려면 캐스트 연산자가 필요합니다. 위의 선언은 다음 형식으로 나타낼 수 있습니다.
ptr_var=(type_cast* ) malloc (size)
여기서 ptr_var
은 할당 된 메모리 블록의 시작 주소를 유지하는 포인터의 이름입니다. type_cast
는 반환 된 포인터 (또는 유형 void)가 변환 될 데이터 유형이며 size는 할당 된 메모리 블록의 크기를 바이트 단위로 나타냅니다 .
예 : int *ptr;
ptr=(int*) malloc (10 * size of (int));
malloc 함수에 의해 할당 된 메모리 는 가비지 값을 포함합니다 .
해당 요청이 malloc에 의해 생성되어 시스템 RAM에 의해 부여 된 메모리를 할당했는지 또는 요청 된 공간을 사용할 수없는 경우에 거부되었는지 확인합니다. 필요한만큼의 메모리가 할당되지 않은 속성을 사용할 수 있습니다. malloc 함수는 NULL을 반환합니다.
calloc ()의 정의
calloc 함수는 malloc ()의 경우처럼 두 개의 인수가 필요하다는 사실을 제외하고 malloc 함수와 정확히 동일하게 동작합니다. 단 하나의 인수 만 필요합니다.
예 : int*ptr;
ptr = (int*)calloc(10, 2);
여기서 2 는 우리가 할당이 이루어 지길 원하는 바이트의 데이터 유형의 크기를 지정합니다.이 경우에는 정수의 경우 2입니다. 그리고 10은 할당 할 요소의 수를 나타냅니다.
malloc 함수에 전달 된 인수는 (n * 10), 여러 인수가 항상 쉼표로 구분되기 때문에 혼동하지 말아야한다는 것을 기억하십시오. 인수 (n * 10)에는 쉼표가 없습니다. 그러므로 그것은 단 하나의 논증이지만 단순한 표현이 아니라 표현입니다.
위의 선언으로 돌아가서 위의 명령문을 실행 한 후 20 바이트의 메모리 블록이 요청 프로그램에 할당되고 첫 번째 블록의 주소가 요청 프로그램에 할당되고 첫 번째 블록의 주소가 포인터에 할당됩니다 ptr.
calloc 함수에 의해 할당 된 메모리는 모두 0을 유지합니다. calloc 함수는 또한 헤더 파일에서 얻을 수있다. 또는
터보 C.
malloc과 calloc의 주요 차이점
malloc과 calloc 함수의 주요 차이점은 다음과 같습니다.
- 요청 된 메모리의 단일 블록은 malloc에 할당되는 반면, 요청 된 메모리의 여러 블록은 calloc에 의해 할당됩니다.
- malloc 함수는 할당 된 메모리를 지우거나 초기화하지 않습니다. 그것은 쓰레기 값을 포함하고 할당 된 메모리의 항목은 변경할 수 없습니다. 반대로, calloc은 할당 된 메모리를 0으로 초기화한다.
- malloc은 calloc보다 빠른 초기화 단계가 필요하기 때문에 calloc보다 빠르지 만 그 차이는 무시할 만하다.
- 이 두가지의 또 다른 차이점은 calloc은 malloc + memset이고 memset은 물리적 페이지를 메모리에 할당하는 반면 malloc은 가상 주소의 힙에있는 메모리 만 할당한다는 것입니다.
결론:
malloc과 calloc 함수는 모두 메모리를 할당하는 데 사용되며 특정 이점이 있으며 malloc과 같은 단점은 calloc에 비해 빠릅니다. 게다가 calloc은 메모리를 할당하고 메모리 영역을 0으로 초기화하기 때문에 malloc은 사용하기가 더 쉽다. 그러나 변수 초기화 가 더 중요 할 때 calloc을 사용하는 것을 선호합니다.