2010-02-06 3 views
9

나는이 tutorial (http://theocacao.com/document.page/234)을 따르고 있습니다. 이 단락에 대해 혼란 스럽다. 주로 calloc과 관련된 행이다.calloc vs malloc에 ​​관한 C 자습서 질문

또한 calloc이라는 malloc 함수의 변형을 사용할 수도있다. calloc 함수는 두 개의 인수, 즉 값 수와 기본 값 크기를 취합니다. 는 또한 어떤 경우에는 예측할 수없는 행동과 충돌을 피하는 데 유용 포인터를 반환하기 전에 메모리를 지 웁니다 마지막 줄이 나를 혼란

있다. 기억을 깨끗하게한다는 것은 무엇을 의미합니까?

답변

20

함수 calloc은 반환 된 메모리의 모든 바이트를 0으로 설정합니다. malloc은 이러한 보장을하지 않습니다. 반환하는 데이터는 임의의 데이터로 구성 될 수 있습니다.

이 구분은 데이터 멤버의 초기화에 매우 유용합니다. 0이 구조체의 모든 값에 대한 적절한 기본값이라면 calloc은 구조체 생성을 단순화 할 수 있습니다.

Foo* pFoo = calloc(1, sizeof(Foo)); 

대는

Foo* pFoo = malloc(sizeof(Foo)); 
pFoo->Value1 = 0; 
pFoo->Value2 = 0; 

널은 명확성을 위해 생략 검사.

+0

... * 사용자가 메모리를 제대로 초기화하지 않으면 예측할 수없는 결과가 발생합니다. – dmckee

+0

'realloc()'을 사용하려고한다면, 여분의 메모리가 0이 아니기 때문에 처리해야합니다. 따라서 작업을 철저히 (충분하게)하기 위해서는 초기화 코드가 필요할 것입니다. 분명히, 만약 당신이'calloc()'메모리를 사용하고 결코 realloc()하지 않는다면, 이것은 중요하지 않습니다. –

+1

"임의의 데이터로 구성됩니다"- 특정 값이 "임의"인 경우.통계 테스트는 0 ... UCHAR_MAX ;-)에 걸친 균일하게 분산 된 이산 확률 변수의 연속 샘플과 구별 할 수 있습니다. –

7

정확하려면 어떤 경우

에서 예기치 않은 동작과 충돌을 피하는 데 유용

읽어야합니다 예측할 수 숨기기에 유용

행동과 충돌로 특정 사례

4

이 경우 "메모리를 지우려면"은 물리적으로 모두 제로 비트 패턴으로 채우는 것을 의미합니다. 공식적인 관점에서 볼 때, 이런 종류의 원시 메모리 초기화는 완전한 유형으로 만 작동한다는 것을 보장합니다. 나는. 정수형의 객체는 0의 초기 값을 받도록 보장됩니다. 이것에 의해 다른 타입이 의미있게 초기화 될지 어떨지는 구현에 의해 정의됩니다. POSIX, IEEE 754 등)

calloc을 사용하여 인용문에 설명 된대로 "크래시 방지"를 사용하는지 여부는 실제로 다른 질문입니다 . 게으른 프로그래머가 작성한 코드의 안정성을 실제로 향상시킬 수 있다는 의미에서, 다양한 가비지 값에 의해 트리거되는 모든 예기치 않은 동작을 모두 0 인 값으로 트리거되는 한 예기치 않은 동작으로 변환 할 수 있습니다.