如图,请教一下关于memcpy()函数

这个程序说memcpy()函数,当源内存块与目标内存块重叠时,将会覆盖掉原来了数据,我运行的时候没覆盖啊,是可能覆盖吗?一下是运行结果。


http://img3.mukewang.com/623adc660001511004480501.jpg

http://img.mukewang.com/623adc7e00014f3d06410419.jpg

慕容3067478
浏览 187回答 2
2回答

郎朗坤

取决于编译器memcpy实现的方式一般有三种,从头复制 从尾复制 或者判断复制(等同于memmove)仿照你的 我写了一个测试程序char message2[60] = "abcdefghijklmnopqrstuvwxyz";char tmp[60];int main(){    strcpy(tmp, message2);    printf("tmp= \"%s\"\n", tmp);    memcpy(tmp+4, tmp + 16, 10);    printf("memcpy(tmp+4, tmp + 16, 10);> tmp = \"%s\"\n", tmp);    strcpy(tmp, message2);    memcpy(tmp+6, tmp +4, 10);    printf("memcpy(tmp+6, tmp +4, 10);> tmp = \"%s\"\n", tmp);    strcpy(tmp, message2);    memcpy(tmp+4, tmp +6, 10);    printf("memcpy(tmp+4, tmp +6, 10);> tmp = \"%s\"\n", tmp);     }测试结果如下tmp= "abcdefghijklmnopqrstuvwxyz"memcpy(tmp+4, tmp + 16, 10);> tmp = "abcdqrstuvwxyzopqrstuvwxyz"memcpy(tmp+6, tmp +4, 10);> tmp = "abcdefefefijijmnqrstuvwxyz"memcpy(tmp+4, tmp +6, 10);> tmp = "abcdghijklmnopopqrstuvwxyz"可以看到 在memcpy(tmp+6, tmp +4, 10);时出现了覆盖 efefef说明我的编译器(gcc)在做memcpy的时候使用的是头复制 即从起始地址开始复制如果这个不出错 而memcpy(tmp+4, tmp +6, 10);出错 那么就是尾复制都不出错的话 那么就是判断之后智能复制 相当于memmove

忽然笑

该例子说明几个问题1. mem开头的函数基本上都是对内存操作的,它们不管内存里放的是什么数据,只要给出长度,它们就操作。不像strcpy、strcmp等函数一定以'\0'结尾,而且是字符。mem可以操作可见字符、不可见字符、控制字符等,任意数据都可以。2. memcpy是内存复制函数原型:void * memcpy(void *dest, void const *src, unsigned int length);功能:从src的起始位置复制length个字节到dst的内存起始位置。你可以用这种方法复制任何类型的值,第3个参数指定复制值的长度(以字节计)。如果src和dst以任何形式出现了重叠,它的结果是未定义的。3. memset函数原型:void * memset(void *a, int val, unsigned int length);功能:把从a开始的length个字节都设置为值val。例子:memset(buffer, 0, SIZE);
打开App,查看更多内容
随时随地看视频慕课网APP