我运行VC程序完后,运行结果正确,但是出来一个对话框,提示"0x00405d79"指令引用的"0x0000000"内存。该内存不能为"read".我的代码如下:
#include "stdafx.h"
#include "iostream.h"
#include "fcntl.h"
#include "stdlib.h"
#include "ctype.h"
#include "stdio.h"
#include "dos.h"
#include "io.h"
#include<conio.h>
#include<string.h>FILE *fp;
unsigned char d[2]; //用来存放临时读取的字节
unsigned char dat[100][256]; //用来存放病毒特征码
unsigned char string[100][256];//用来存放病毒提示信息
int v1;//特征码查找函数
int find(unsigned char *dat1,unsigned char *hex)
{
//获得字符串的长度
unsigned long len=strlen((char *)dat1);
unsigned long num=0,hnum=0,i;
for(i=0;i<len;i++)
{
if(dat1[i]!=hex[hnum])
{
//遇到一个“?”号,则向前推进2个字符
if(dat1[i]=='?')
{
i++;
hnum+=2;
continue;
}//if==? //遇到一个%号,则向前推进32个字符
if(dat1[i]=='%')
{
i++;
for(num=0;num<32;num++)
{
if(dat1[i+1]==hex[hnum+num])
{
//递归匹配字串
if(find(&dat1[i+1],&hex[hnum+num])==1)
return 1;
}//if(dat1
}//for(num
}//if(dat1
return 0;
}//if
hnum++;
}//for
return 1;
}//int
//在指定的文件中查找病毒
int findvirus()
{
FILE *fh;
unsigned int rnum;
unsigned char *buf;
unsigned char *hex;
unsigned char x1,x2,vn[110];
unsigned long rsize=500,i,j,flen;
int v;

//把字符串vn全部置0
strset((char *)vn,'0');

//为匹配字符串分配空间,如果内存不足,则显示提示信息后,返回
if((hex=(unsigned char *)malloc(1000))==NULL)
{
cout<<"内存不足,请关闭一些程序以释放内存。"<<endl;
return 1;
}//if //为缓冲区分配空间,如果内存不足,则显示提示信息后,返回
if((buf=(unsigned char *)malloc(500))==NULL)
{
cout<<"内存不足,请关闭一些程序以释放内存。"<<endl;
return 1;
}//if

//打开文件
fh=fopen("msconfig.exe","rb+");
//获得文件长度
flen=filelength(fileno(fh)); 

rnum=1;

//rsize 为每次读文件的字节数,初始值为500。如果文件长度少于等于500,则只需读一次就够了
if(flen<=rsize)
{
rsize=flen;
rnum=0;
}//if for(j=0;j<=rnum;j++)
{
//只对文件头部和尾部进行匹配
if(j==1)  
fseek(fh,-500L,2);
else
fseek(fh,0L,0);
//开始读文件
fread(buf,500,1,fh);

//关闭文件
fclose(fh);     //把所读字节转换成十六进制形式表示,
//例如,把“A(65)”转换成4和1,从而形成41,以与文本特征码对应
for(i=0;i<500;i++)
{

x1=buf[i]/16;
x2=buf[i]-x1*16;
hex[2*i]=x1<10?x1+0x30:x1-10+0x41;
hex[2*i+1]=x2<10?x2+0x30:x2-10+0x41;
} //把所读信息与病毒库信息逐个比较,看是否匹配
for(v=0;v<v1;v++)
{
for(i=0;i<rsize;i++)
{
if(hex[2*i]==dat[v][0]&&hex[2*i+1]==dat[v][1])
//调用特征码查找函数
if(find(dat[v],&hex[2*i])==1)
{
if(vn[v]=='0')
{
vn[v]='1';
cout<<" "<<endl; //显示找到病毒提示信息
cout<<string[v]<<endl;
}//if(vn
}//if(find
}//for(i
}//for(v }//for(j=0;j<rnum


//释放内存
free(buf);  
free(hex);
return 0;
}//int
void main()
{
unsigned long n,dnum;
int end=0;//病毒特征码和提示信息读取完毕的标志
FILE *fp; //以只读方式打开病毒库文件
fp=fopen("virus.dat","r"); //无法打开,则显示提示信息后退出
if(fp==NULL)
{
cout<<"无法打开病毒特征库,请检查特征库文件是否在当前目录下。"<<endl;
exit(0);
} //把文件指针移到文件开头的第一个字节
fseek(fp,1,0); //假设病毒库中有1000条病毒信息,每循环一次,读取一条
for(v1=0;v1<100;v1++)
{
//下面循环读取病毒特征码,假设每条病毒特征码不超过256个字符
for(dnum=0,n=0;dnum<256;dnum++)
{
//一次读一个字节
fread(d,1,1,fp);

//如果所读的字节为“"”,说明已经读完,该条病毒特征码没有256个字符,
//则增加结束符后,退出内循环
if(d[0]=='"')
{
dat[v1][n]='\0';
break;
}//if(d[0] //如果所读字节为空格,则继续读下一个字节
if(d[0]==' ')
continue; //既非“"”,又非空格,则把读出的字符放到数组dat相应的单元里
dat[v1][n]=d[0];
n++;
}//for(dnum //下面循环读取病毒特征码后面的提示信息,假设每条提示信息不超过256个字符
for(dnum=0,n=0;dnum<256;dnum++)
{
//若所读的字节为NULL,说明整个库已经读完,则增加结束符,结束标志置位后,退出内循环
if(fread(d,1,1,fp)==NULL)
{
string[v1][n]='\0';
end=1; //结束标志置位
break;
}//if(fread //如果所读的字节为“"”,说明已经读完,该条提示信息没有256个字符,
//则增加结束符后,退出内循环
if(d[0]=='"')
{
string[v1][n]='\0';
break;
}//if(d[0] //如果所读字节是不可显示字符,则继续读取下一个字节
if(d[0]<0x20)
continue; //既不是“"”,也不是空白,又是可显示字符,则把所读字节放入string数组的相应单元里
string[v1][n]=d[0];
n++;
}//for(dnum //把dat数组字符串转换为大写
strupr((char *)dat[v1]); //如果结束标志已置位,则全部读完,没有1000条信息,直接跳出大循环
if(end==1)
break;
}//for(v1 //调用查找病毒的函数
findvirus();
    fclose(fp);
}谢谢,在线等啊,谢谢了