- 论坛徽章:
- 0
|
memcpy() 与 memmove() 这两个函数与 strcpy(),strncpy()有点类似,但区别很大。memcopy(), memmove()分两种情况:
(1) 目标地址在源地址前面的情况
dest src
|------------------|-------------|
|------------------|
count
(2) 目标地址在源地址后面的情况
src dest
|-------------|---------------------|
|-----------------|
count
memcpy() 在(2)的状态下会覆盖部分内存,因此采用了memmove()来弥补这一缺陷。
void *memcpy(void *pdst, const void *psrc, size_t count)
{
BYTE *iter = pdst;
while (count > 0)
{
*iter++ = *psrc++;
count--;
}
return pdst;
}
这里的count 我理解为字节数,数据拷贝以字节为单位。
void *memmove(void *pdst, const void *psrc, size_t count)
{
BYTE *pd;
BYTE *ps;
if (pdst < psrc)
{
pd = pdst;
ps = psrc;
while (count > 0)
{
*pd++ = *ps++;
count--;
}
}
else
{
pd = pdst + count;
ps = psrc + count;
while (count > 0)
{
*--pd = *--ps;
count--;
}
}
return pdst;
}
例如 a[50], dest=&a[0], src=&a[5], count=10的情况(1)
src=&a[0], dest=&a[5], count=10的情况(2)
用memcpy()在(2)时就把dest开始部分的一段数据给覆盖了,而memmove()则完整地完成了拷贝。
[ 本帖最后由 syukayo 于 2009-11-30 20:35 编辑 ] |
|