memmove 与memcpy
来源:互联网 发布:西安软件新城 2017 编辑:程序博客网 时间:2024/06/09 17:09
说下memmove ,简单解释下,如果目标地址dst在源地址src 到src +count 之间的话需要从后面向前拷贝 (不然dst的后部分得不到需要的结果,成了src的前部分了,dst前面可能出现传播效应)
如
dst = (char *)dst + count - 1;
src = (char *)src + count - 1;
然后
while (count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst - 1;
src = (char *)src - 1;
}
这样目标是获得需要的结果,src后部分被修改。
否者就从地地址到高地址来拷贝,如
while (count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
这样目标是获得需要的结果,如果dst <src && dst + count >dst 的话,src前部分会被修改。
源码如下
void * __cdecl memmove (
void * dst,const void * src,
size_t count
)
{
void * ret = dst;
if (dst <= src || (char *)dst >= ((char *)src + count)) {
/*
* Non-Overlapping Buffers
* copy from lower addresses to higher addresses
*/
while (count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
}
else {
/*
* Overlapping Buffers
* copy from higher addresses to lower addresses
*/
dst = (char *)dst + count - 1;
src = (char *)src + count - 1;
while (count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst - 1;
src = (char *)src - 1;
}
}
return(ret);
}
对比下,memcpy 就没考虑那麽多,都是从低地址到高地址的拷贝所以必须不能出现
dst >=src && dst <src +count 的情况,否者dst就不是想要的结果。
void * __cdecl memcpy (
void * dst,
const void * src,
size_t count
)
{
void * ret = dst;
/*
* copy from lower addresses to higher addresses
*/
while (count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
return(ret);
}
- memcpy 与 memmove 实现
- memcpy与memmove区别
- memcpy 与 memmove 区别
- memmove与memcpy
- memcpy与memmove区别?
- memcpy与memmove
- memmove 与memcpy
- memcpy与memmove
- memcpy与memmove
- memcpy与memmove
- memmove与memcpy
- memmove与memcpy区别
- memcpy与memmove源码
- memcpy 与 memmove
- memcpy与memmove解析
- memcpy 与 memmove
- memmove与memcpy区别
- memcpy与memmove区别
- LA_3635/HDU_2333 Assemble (二分)
- log4j.rootLogger 是配置
- Page,request,Session,application区别
- java中byte数组与int,long,short间的转换 .
- framespaing、frameborder和border关系
- memmove 与memcpy
- Ucenter会员同步登陆通讯原理
- java classloader原理初探
- MYSQL的COMMIT和ROLLBACK
- 在ios6中调用苹果地图用于导航 (地图开发)
- 什么是活动分区
- S5PC100看门狗定时器(源码解读)
- JS 验证密码 不能为空,必须含有数字、字母、特殊字符,长度在8-12位
- re-dis 操-作-配-置