拷贝的目的地址在源地址的范围内,有重叠。
如在写程序的过程中,我们用到的strcpy这个拷贝函数,在这个函数中我们定义一个目的地址,一个源地址,在拷贝的过程中如果内存重叠了,使用这个函数程序会出现问题,源地址与目的地址重叠,目的地址在源地址的范围内,发生了内存重叠。
2.如何判断内存重叠
可以将它们的地址求出来。
(1)若目的地址小于源地址,即目的地址的数据覆盖了源地址。则发生了内存重叠。(左边为低地址)
如:目的地址 地址:100 源地址地址:104
( 2 )目的地址所指的区域是源地址的一部分。
如:目的地址 地址:100 源地址:096
3.如何解决内存重叠。
在遇到内存重叠这一问题时,要考虑拷贝的方向。当源地址和目的地址不重叠时,由低字节向高字节拷贝。当这两者重叠时,高字节向低字节拷贝。在使用strcpy和memcpy这两个函数来复制字符串时,会遇到内存重叠问题,因为这两个函数不对内存重叠进行判断。而我们可以用memmove函数来判断,这个函数对内存重叠进行了判断,我们可以看一下这三个函数的原型:
1.strcpy()原型写法: 字符串拷贝.
char *strcpy(char *strDest, const char *strSrc)
{
assert((strDest!=NULL) &&(strSrc !=NULL))
char *address = strDest
while( (*strDest++ = * strSrc++)·1 != '/0')
NULL
return address
}
2.memcpy函数的原型写法:内存拷贝
void *memcpy(void *dest, const void *source, size_t count)
{
assert((NULL != dest) &&(NULL != source))
char *tmp_dest = (char *)dest
char *tmp_source = (char *)source
while(count --)//不对是否存在重叠区域进行判断
*tmp_dest ++ = *tmp_source ++
return dest
}
3.memmove函数的原型写法:
void *memmove(void *dest, const void *source, size_t count)
{
assert((NULL != dest) &&(NULL != source))
char *tmp_source, *tmp_dest
tmp_source = (char *)source
tmp_dest = (char *)dest
if((dest + count
{
while(count--)
*tmp_dest++ = *tmp_source++
}
else//如果有重叠(反向拷贝)
{
tmp_source += count - 1
tmp_dest += count - 1
while(count--)
*--tmp_dest = *--tmp
}
return dest
}
在进行内存重叠的考虑时,strcpy,memcpy都要做一个内存重叠的判断:
对于strcpy需要加上一个断言:
int count = strlen(src) + 1
Assert (dest(src+count))
对于memcpy需要加上一个断言:Assert(dst<=src || src+count
电脑内存出现故障,就会导致电脑在运行的时候出现死机、蓝屏等故障,无法正常使用电脑。那么,电脑内存出现故障怎么办呢?
故障原因一:
Windows系统中运行的.应用程序非法访问内存、内存中驻留了太多应用程序、活动窗口打开太多、应用程序相关配置文件不合理等原因均能导致屏幕出现许多有关内存出错的信息。
出现这种故障必须采用清除内存驻留程序、减少活动窗口、调整配置文件,重装系统和应用程序等办法来处理。
故障原因二:
程序有病毒,病毒程序驻留内存、CMOS参数中内存值的大小被病毒修改,将导致内存值与内存条实际内存大小不符、内存工作异常等现象。
采用杀毒软件消除病毒;CMOS中参数被病毒修改,先将CMOS短接放电,重新启动机器,进入CMOS后仔细检查各项硬件参数,正确设置有关内存的参数值。
故障原因三:
内存条与主板插槽接触不良、内存控制器出现故障表现为:打开主机电源后屏幕显示“Error:Unable to Contro IA20 Line”出错信息后死机。
仔细检查内存条是否与插槽保持良好接触或更换内存条。
故障原因四:
Windows系统中运行DOS状态下的应用软件如DOS下运行的游戏软件等 时,因软件之间分配、占用内存冲突出现黑屏、花屏、死机现象。
退出Windows系统,进入DOS状态,再运行应用程序。
故障原因五:
自检通过。在DOS状态下运行应用程序因占用的内存地址冲突,而导致内存分配错误,屏幕出现“Memory A1locationError”的提示。
因Confis.sys文件中没有用Himem.sys、Emm386.exe等内存管理文件设置Xms.ems内存或者设置不当,使得系统仅能使用640KB基本内存,运行的程序稍大便出现“Out of Memory”(内存不足)的提示,无法操作。这些现象均属软故障,编写好系统配置文件Config.sys后重新启动系统即可。
故障原因六:
电脑升级进行内存扩充,选择了与主板不兼容的内存条。
首先升级主板的BIOS,看看是否能解决问题,如果仍无济于事,就只好更换内存条了。