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:
- 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
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.
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.
/*
* 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