memcpy与memmove的区别

来源:互联网 发布:mac玩游戏卡 编辑:程序博客网 时间:2024/05/16 12:36

我的试验结果是2个函数的执行效果没有区别. vc6sp6 + winxp.

同学查了资料说是和库实现有关, 那么以后一律用memmove, 不用memcpy了.

// test.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <windows.h>#include <crtdbg.h>void fnTest1();void fnTest2();int main(int argc, char* argv[]){    /** 在网上看到的结论    memcpy与memmove的目的都是将N个字节的源内存地址的内容拷贝到目标内存地址中。    但当源内存和目标内存存在重叠时,memcpy会出现错误,而memmove能正确地实施拷贝    但是我试验的结果, memcpy与memmove地址有重叠时, 正向拷贝和反向拷贝都正确    能举出一种 memcpy与memmove 效果不同的情况么?    */        fnTest1();    fnTest2();return 0;}void fnTest1(){    char szBuf[8] = {'0', '1', '2', '3', '4', '5', '6', '7'};    char szBuf2[8] = {'0', '1', '2', '3', '4', '5', '6', '7'};    /// 当src首地址 > dst首地址时, memmove和memcpy效果是相同的, 且都正确    memmove(&szBuf[2], &szBuf[4], 4);    /**    -szBuf0x0109ff78 "01456767?.y.g"[0x0]0x30 '0'[0x1]0x31 '1'[0x2]0x34 '4'[0x3]0x35 '5'[0x4]0x36 '6'[0x5]0x37 '7'[0x6]0x36 '6'[0x7]0x37 '7'    */    memcpy(&szBuf2[2], &szBuf2[4], 4);    /**    -szBuf20x0109ff70 "0145676701456767?.y.g"[0x0]0x30 '0'[0x1]0x31 '1'[0x2]0x34 '4'[0x3]0x35 '5'[0x4]0x36 '6'[0x5]0x37 '7'[0x6]0x36 '6'[0x7]0x37 '7'    */}void fnTest2(){    char szBuf[8] = {'0', '1', '2', '3', '4', '5', '6', '7'};    char szBuf2[8] = {'0', '1', '2', '3', '4', '5', '6', '7'};    /// 当src首地址 < dst首地址时, memmove和memcpy效果是相同的, 且都正确    memmove(&szBuf[4], &szBuf[2], 4);    /**-szBuf0x0109ff24 "01232345€.R.g"[0x0]0x30 '0'[0x1]0x31 '1'[0x2]0x32 '2'[0x3]0x33 '3'[0x4]0x32 '2'[0x5]0x33 '3'[0x6]0x34 '4'[0x7]0x35 '5'    */    memcpy(&szBuf2[4], &szBuf2[2], 4);    /**-szBuf20x0109ff1c "0123234501232345€.R.g"[0x0]0x30 '0'[0x1]0x31 '1'[0x2]0x32 '2'[0x3]0x33 '3'[0x4]0x32 '2'[0x5]0x33 '3'[0x6]0x34 '4'[0x7]0x35 '5'    */}


0 0
原创粉丝点击