读书人

memcpy跟memmove两函数的区别

发布时间: 2013-02-18 10:50:49 作者: rapoo

memcpy和memmove两函数的区别
题目:char str1[] = "this is a string";
char str2[] = "this is a string";
memcpy(str1 + 4, str1, 6);
memmove(str2 + 4, str2, 6);

现在请把你猜测的str1和str2的输出写下来,再去编译器看结果,如果你的输出与编译器一致,请解释一下,谢谢~~memcpy跟memmove两函数的区别
[解决办法]
顾名思义:
copy操作保证操作前后目标和源内容一致且源内容不被破坏。
move操作仅保证操作后目标内容和操作前源内容一致,不保证源内容不被破坏。
所以
copy用于源和目标不重叠;
move用于源和目标有重叠。
[解决办法]
memcpy 内存块不能重叠
memmove 内存快可以重叠
完毕
[解决办法]
不用试验
memcpy的结果是不确定的。
memmov的结果是"thisthis istring"

[解决办法]
搞不懂你想干什么,既然知道区别,看一下源代码就知道结果应该是什么样的了,有什么好解释的
[解决办法]

引用:
引用:很奇怪楼主到底想知道什么,还是想说明什么?
我想表达的意思是:查看代码,memcpy一直都是是从前往后进行拷贝;而memmove如果有重叠,就从后往前拷贝,但是上面例子,str1和str2的结果是一样的,

谁说的memmove如果有重叠,就从后往前拷贝?你仔细看过代码没?

void * __cdecl memmove (
void * dst,
const void * src,
size_t count
)
{
void * ret = dst;

#if defined (_M_IA64)
{
extern void RtlMoveMemory( void *, const void *, size_t count );

RtlMoveMemory( dst, src, count );
}
#else /* defined (_M_IA64) */
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;
}
}
#endif /* defined (_M_IA64) */

return(ret);
}

[解决办法]

引用:
,我知道这个区别,你们怎么没看我的要求呢,写结果啊,不要光说不写啊,亲

memcpy明确说了 不让你这么干
结果不确定 能怎么说

[解决办法]
C不检查越界什么的
它假定它的书写者(程序员)知道自己在干什么
当然SB的话C就没辙了
C就是这么傻

读书人网 >C++

热点推荐