memcpy 什么都不做

memcpy doesn't do anything

我试图将双缓冲放入我的 VGA dos 程序中,但是当我使用 memcpy 函数时似乎出现了问题。

我确定我分配了所需的内存,但它似乎不起作用。

程序如下:

#include <dos.h>
#include <string.h>
unsigned char* doublebuffer;
unsigned char far* VGA = (unsigned char far*) 0xA0000000L;
void setmode(int mode)
{
   union REGS regs;
   regs.h.ah = 0x0;
   regs.h.al = mode;
   int86(0x10, &regs, &regs);
}

void main()
{
    doublebuffer =(unsigned char *) malloc(320*200);

    setmode(0x13);
    VGA[9*320+11] = 0x41;
    doublebuffer[9*320+10] = 15;
    if(doublebuffer[9*320+10]  != 15)
    {
     exit(1);
    }
    memcpy(VGA, doublebuffer, 320*200);
    getch();
}

malloc 有效,因为程序没有崩溃并且缓冲区接受颜色,但 memcpy 似乎无效,因为屏幕上没有任何内容。

当我直接写入 VGA 地址时,它起作用了。 (11, 9) 上会有一个粉红色像素,但 (10, 9) 上没有白色像素

您的问题是您可能正在使用近数据模型进行编译,例如默认情况下数据指针接近的微型或小型内存模型。 Near 数据指针只能引用默认数据段中的东西,而 VGA 帧缓冲区位于此默认数据段之外。虽然您将变量 VGA 正确定义为远指针,但当您将此指针传递给 memcpy 时,它会被转换为近指针,因为 memcpyvoid * 作为第一个参数.由于您使用的是近数据模型 void * 是近指针类型。

要解决此问题,您应该使用函数 _fmemcpy 而不是将 void far * 指针作为参数,因此您的 VGA 指针不会被转换为近指针。

您还应该注意编译器警告。您的编译器应该已通过如下消息警告您此问题:

Warning: test.c 24: Suspicious pointer conversion in function main

您还应该注意并修复有关调用没有原型的函数的警告,因为正确的原型函数允许编译器警告上述可疑指针转换。