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的输出写下来,再去编译器看结果,如果你的输出与编译器一致,请解释一下,谢谢~~
[解决办法]
顾名思义:
copy操作保证操作前后目标和源内容一致且源内容不被破坏。
move操作仅保证操作后目标内容和操作前源内容一致,不保证源内容不被破坏。
所以
copy用于源和目标不重叠;
move用于源和目标有重叠。
[解决办法]
memcpy 内存块不能重叠
memmove 内存快可以重叠
完毕
[解决办法]
不用试验
memcpy的结果是不确定的。
memmov的结果是"thisthis istring"
[解决办法]
搞不懂你想干什么,既然知道区别,看一下源代码就知道结果应该是什么样的了,有什么好解释的
[解决办法]
谁说的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就是这么傻