malloc() May Truncate Request Greater Than 64K

Last reviewed: July 17, 1997
Article ID: Q32998
5.10 6.00 6.00a 6.00ax 7.00 | 5.10 6.00 6.00a | 1.00 1.50
MS-DOS                      | OS/2            | WINDOWS
kbprg

The information in this article applies to:

  • The C Run-time (CRT), included with:

        - Microsoft C for MS-DOS, versions 5.1, 6.0, 6.0a, and 6.0ax
        - Microsoft C for OS/2, versions 5.1, 6.0, and 6.0a
        - Microsoft C/C++ for MS-DOS, version 7.0
        - Microsoft Visual C++ for Windows, versions 1.0 and 1.5
    

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>

short *array;

void main()
{
    array= (short *)malloc(32768*sizeof(short));
    if (array == NULL)
        printf("Not enough memory, no allocation!\n");
    else
        printf("Memory allocated.\n");

    array= (short *)malloc(32767*sizeof(short));
    if (array == NULL)
        printf("Not enough memory, no allocation!\n");
    else
        printf("Memory allocated.\n");
}


Additional reference words: kbinf 1.00 1.50 5.10 6.00 6.00a 6.00ax 7.00
KBCategory: kbprg
KBSubcategory: CRTIss
Keywords : kb16bitonly


THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Last reviewed: July 17, 1997
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.