Getting the Address of a Function with FP_SEG and FP_OFF

ID: Q35295

5.10 6.00 6.00a 6.00ax 7.00 | 5.10 6.00 6.00a | 1.00

MS-DOS                      | OS/2            | WINDOWS
kbprg kbcode

The information in this article applies to:

SUMMARY

In Microsoft C versions 5.0, 5.1, 6.0, 6.0a, 6.0ax, C/C++ version 7.0, and Visual C++ 1.0, to get the segment and offset of a function named myfunc, declare a pointer to a function, assign myfunc to that pointer, and use FP_SEG and FP_OFF to get the segment and offset from the pointer.

MORE INFORMATION

If the sample program below is compiled for the tiny, small or compact memory models, the segment value will be zero. This is because in these memory models a function pointer is a near (offset only) pointer.

The following sample code demonstrates this process:

Sample Code

/* Compile options needed: none
*/ 

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

int myfunc( void );
int (*myfunc_ptr)();

unsigned int seg_val;
unsigned int off_val;

void main( )
{
   /* set the pointer to the function */ 

   myfunc_ptr = myfunc;
   /* use FP_SEG() and FP_OFF() to get segment and offset */ 

   seg_val = FP_SEG(myfunc_ptr);
   off_val = FP_OFF(myfunc_ptr);

   printf( "Segment is %d\nOffset is %d\n", seg_val, off_val );
}

int myfunc()
{ }

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

Last Reviewed: July 18, 1997