memcpy什么都不做

问题描述

我试图在我的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数据模型进行编译,例如默认情况下数据指针接近的微型或小型内存模型。 Near数据指针只能引用默认数据段中的内容,而VGA帧缓冲区位于此默认段之外。在将变量VGA正确定义为远指针的同时,将此指针传递给memcpy时,它被转换为近指针,因为memcpy的第一个参数为void * 。由于您使用的是Near数据模型,void *是Near指针类型。

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

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

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

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