사례 1 :왜 malloc (LONG_MAX)은 불평하지만 malloc (ULLONG_MAX)은 그렇지 않습니까?
#include <stdlib.h>
#include <limits.h>
int main()
{
void *mem = malloc(ULLONG_MAX); /* or ULONG_MAX */
return 0;
}
사례 2 :
#include <stdlib.h>
#include <limits.h>
int main()
{
void *mem = malloc(LLONG_MAX); /* or LONG_MAX */
return 0;
}
두 경우는 NULL 포인터를 반환하고 예상대로 12 (ENOMEM) errno를 설정한다. 그런 일이 왜 ULLONG_MAX이
시스템은 맥 OS X 10.8.5입니다 LONG_MAX보다 큰 있기 때문에
long(5072) malloc: *** mmap(size=9223372036854775808) failed (error code=12) *** error: can't allocate region *** set a breakpoint in malloc_error_break to debug
난 그냥 궁금 해서요, 애플 LLVM :하지만 후자, 실제로 메모리 부족에 대한 불만 버전 5.1 (clang-503.0.40)
은'ULLONG_MAX' 아마도 '에 대한 수용 가능한 수에 오버 플로우 malloc'. –
'malloc()'은'ULLONG_MAX'에서 실패 할 수 있습니다. 왜냐하면 시스템은 그것이 처리 할 수있는 어떤 상황보다도 빠르다는 것을 알고 있기 때문입니다. 'LLONG_MAX'의 값이 작을수록 _might_work로 인식하고 할당을 시도하기 시작합니다. 실패한 이유는 다른 이유 때문입니다. 주 : 모든 할당은 'size_t'유형의 'N + 1'에 대한 색인을 허용해야하며 'ULLONG_MAX + 1'이 (가) 오버 플로우 할 수 있습니다. – chux
@RedAlert'sizeof (size_t)! = sizeof (unsigned long long)'이있는 시스템/컴파일러 조합에서도'malloc()'에 넘겨지는 숫자가 넘쳐 흐르지 않습니다. ;-) –