2010-11-22 4 views
9

가능한 중복 :
c difference between malloc and calloc선호의 malloc은 calloc 이상

당신은 calloc을 통해 malloc을 선호 어떤 상황이있다. 둘 다 malloc 및 calloc 동적으로 메모리를 할당하고 calloc 또한 alloted 메모리의 모든 비트를 0으로 초기화합니다. malloc보다 calloc을 사용하는 것이 더 좋습니다. 아니면 malloc이 더 좋은 몇 가지 상황이 있습니까? 성능이있을 수 있습니까?

+0

투표를 다시 열 수 있습니다. 다른 질문은 차이점에 관한 것입니다. 이 질문은 다릅니다. 왜 malloc을 선호하는지 묻습니다 (이것은 일반적인 관행입니다). –

+0

@RaymondHettinger, 올바르게 기억한다면 답이 같은지 상관 없습니다. –

답변

19

동적으로 할당 된 메모리를 0으로 초기화해야하는 경우 calloc을 사용하십시오.

동적으로 할당 된 메모리를 0으로 초기화 할 필요가없는 경우 malloc을 사용하십시오.

항상 초기화 메모리가 필요하지는 않습니다. 메모리 초기화가 필요하지 않은 경우 초기화 비용을 지불하지 마십시오. 예를 들어, 메모리를 할당 한 다음 할당 된 메모리를 채우기 위해 즉시 데이터를 복사하면 제로 초기화를 수행 할 이유가 없습니다.

callocmalloc은 다른 일을하는 기능입니다. 수행해야 할 작업에 가장 적합한 것을 사용하십시오.

+0

감사합니다. 성능이 좋은 지적입니다. 나는 다른 가능한 이유가 있는지 아는 것에 또한 흥미가있었습니다. – user514946

+1

(Ugh ... 그들은 질문을 닫았습니다.이 질문은 "중복"과 약간 다릅니다 ... 때로는 S.O를 싫어합니다.) 어쨌든 malloc에 ​​비해 calloc을 사용하고자하는 몇 가지 이유가 있습니다. 하나는 valgrind가 malloc으로 많은 잠재적 인 허위 경고를 발행하는 것과 같은 프로그램입니다. 또 다른 문제는 버그 노출과 관련이 있습니다. 초기화되지 않은 메모리를 사용하면 엉뚱한 동작으로 인해 calloc을 사용했을 때 눈에 띄지 않는 버그가 있음을 알 수 있습니다. –

2

조심하지 않으면 calloc의 제로 - 초기화에 의존하는 것은 위험 할 수 있습니다. 메모리를 제로화하면 (자), 정수형에는 0, char 형에는 \ 0가 예상대로 제공됩니다. 그러나 반드시 float/double 0 또는 NULL 포인터에 해당하는 것은 아닙니다.

0

일반적으로 뭔가를 저장할 의도가있는 메모리를 할당하고 있습니다. 즉, calloc에 의해 0으로 초기화 된 공간 (다른 대부분의 공간)은 곧 다른 값으로 덮어 쓰게됩니다. 따라서 대부분의 코드는 실제 손실이없는 약간의 추가 속도로 malloc을 사용합니다.

calloc에 대한 거의 유일한 사용은 (아마도) Java의 속도를 C++과 비교하여 벤치마킹 한 코드입니다. C++ 버전에서는 calloc으로 메모리를 할당 한 다음 memset을 사용하여 Java를 선호하는 결과를 생성하는 데있어 상당히 투명한 시도로 메모리를 다시 초기화했습니다.