C 将近指针转换为远指针

C 将近指针转换为远指针,c,pointers,dos,16-bit,C,Pointers,Dos,16 Bit,我有一些代码将文件读入32K的近缓冲区,需要将数据复制到\uu far指针指向的内存位置。我需要使用\u fmemcpy函数来执行此操作,但当调用它时,它会锁定程序 unsigned char *working_buffer; working_buffer = malloc(BUFFER_SIZE); _fmemcpy((unsigned char __far *)p_image_data, (unsigned char __far *)working_buffer, working_leng

我有一些代码将文件读入32K的近缓冲区,需要将数据复制到
\uu far
指针指向的内存位置。我需要使用
\u fmemcpy
函数来执行此操作,但当调用它时,它会锁定程序

unsigned char *working_buffer;
working_buffer = malloc(BUFFER_SIZE);

_fmemcpy((unsigned char __far *)p_image_data, (unsigned char __far *)working_buffer, working_length);

我稍微简化了这个函数调用,如果需要,我可以发布文件加载函数的其余代码。编译器(是数字Mars C 16位,小内存模型)编译此代码时不会出现错误或警告,并一直运行到函数冻结为止。我的最佳猜测是,它并没有真正将
工作缓冲区
转换为
\uu远
指针。但我真的不确定。

在查看数字火星编译器文档时,要将“近”指针转换为“远”指针,必须将宏MK_FP()用作
FP=MK_FP(getDS(),(无符号)np)。好的,谢谢你提供的信息。你真的可以发布一个链接到有这些信息的页面吗?我到处都找不到。此外,这证明了将近指针转换为远指针并没有问题,只是我做了一些非常愚蠢的事情。但无论如何,我真的需要这些信息。你可以在。嗯。。。也许使用更好的编译器。我使用的每一个16位x86编译器都会自动将近指针转换为远指针,方法是将DS段值与近偏移量自动组合。您只需要
\u fmemcpy(p\u image\u数据、工作缓冲区、工作长度)
,假设
\u fmemcpy
的原型在范围内。它实际上可能做到这一点。我的问题并不像我想的那样是由这种转换引起的,但知道这一点还是很好的。实际上,Digital Mars似乎是最好的16位编译器。OpenWatcom有太多的bug,其他编译器都必须在DOS下运行。