near Pointer to far Pointer Conversions Use DS

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

The information in this article applies to:

  • The Microsoft C/C++ Compiler (CL.EXE), included with:

        - Microsoft C for MS-DOS, versions 6.0, 6.0a, and 6.0ax
        - Microsoft C for OS/2, versions 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 an application uses more than one memory model, pointer conversions must be performed correctly. The compiler converts a near pointer to a far pointer using the current value of the DS (data segment) register as the segment value.

MORE INFORMATION

This behavior may cause a problem when the application converts a near pointer returned from a function to a far pointer and compares it to NULL. If the value of the near pointer is NULL, when the application converts it to a far pointer its value is DS:0000h, which cannot be equal to NULL. If the application must use more than one memory model, it can force the segment value to be 0h with the C run-time macro FP_SEG, as demonstrated below.

Sample Code

/*
 * Compile options needed: none
 */

#include <stdio.h>
#include <dos.h>

char __near *func(void)
{
   return NULL;
}

void main(void)
{
   char _far *cptr;

   cptr = func();    // Set segment value to DS
   FP_SEG(cptr) = 0; // Set segment value back to 0
}


Additional reference words: kbinf 1.00 1.50 6.00 6.00a 6.00ax 7.00 8.00
8.00c
KBCategory: kbtool
KBSubcategory: CLIss
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.