INF: malloc() May Truncate Request Greater Than 64K

ID Number: Q32998

4.00 5.00 5.10 6.00 6.00a 6.00ax 7.00 | 5.10 6.00 6.00a

MS-DOS | OS/2

Summary:

When trying to allocate memory with malloc() and calloc(), the request

for memory is truncated if it exceeds 64K.

The maximum number of bytes that can be allocated by malloc() is less

than 64K because the allocation routines consume a certain number of

bytes to track memory allocation within the segment. The maximum

number of bytes you can allocate using malloc() or calloc is

approximately 65516 with C 5.1 and earlier and 65512 with C 6.0 and

later.

Requests for more than 65512 bytes and less than 64K results in malloc

returning NULL. Requests for more than 64K may return a pointer;

however, it will be a pointer to a block of a size other than that

requested because the parameter passed to malloc() is an unsigned

integer. This integer has a maximum value of 64K; passing a number

greater than this value results in undefined behavior. If malloc() is

passed a parameter greater than 64K, the compiler will issue a

data-conversion warning, which should be heeded.

If you require more than about 65512 bytes for a single allocation,

you should use halloc().

More Information:

The following program demonstrates the behavior described above:

Sample Code

-----------

/* Compile options needed: none

*/

#include <stdio.h>

#include <malloc.h>

int *intarray;

main()

{

intarray= (int *)malloc(32768*sizeof(int));

if (intarray == NULL)

printf("not enough memory, no allocation");

else

printf("memory allocated");

intarray= (int *)malloc(32767*sizeof(int));

if (intarray == NULL)

printf("not enough memory, no allocation");

else

printf("memory allocated");

}

Additional reference words: 5.00 5.10 6.00 6.00a 6.00ax 7.00