near Pointer to far Pointer Conversions Use DS

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:

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

Last Reviewed: July 18, 1997