这两个副本函数都用于将 n 个字符从源对象复制到目标对象,但它们有一些区别,如下所述。
如果源指针和目标指针指向的内存区域重叠,则
memcpy
复制函数会显示未定义的行为。memmove
函数在重叠的情况下具有定义的行为。 因此,每当有疑问时,使用memmove
代替memcpy
会更安全。#include <string.h> #include <stdio.h> char str1[50] = I am going from Delhi to Gorakhpur; char str2[50] = I am going from Gorakhpur to Delhi; int main( void ) { //Use of memmove printf( Function:\tmemmove with overlap\n ); printf( Orignal :\t%s\n,str1); printf( Source:\t\t%s\n, str1 + 5 ); printf( Destination:\t%s\n, str1 + 11 ); memmove( str1 + 11, str1 + 5, 29 ); printf( Result:\t\t%s\n, str1 ); printf( Length:\t\t%d characters\n, strlen( str1 ) ); //Use of memcpy printf( Function:\tmemcpy with overlap\n ); printf( Orignal :\t%s\n,str2); printf( Source:\t\t%s\n, str2 + 5 ); printf( Destination:\t%s\n, str2 + 11 ); memcpy( str2 + 11, str2 + 5, 29 ); printf( Result:\t\t%s\n, str2 ); printf( Length:\t\t%d characters\n, strlen( str2 ) ); return 0; }
运行结果:
Function: memmove with overlap Orignal : I am going from Delhi to Gorakhpur Source: going from Delhi to Gorakhpur Destination: from Delhi to Gorakhpur Result: I am going going from Delhi to Gorakhpur Length: 40 characters Function: memcpy with overlap Orignal : I am going from Gorakhpur to Delhi Source: going from Gorakhpur to Delhi Destination: from Gorakhpur to Delhi Result: I am going going fring frakg frako frako Length: 40 characters
与 memcpy 相比,
memmove
函数较慢,因为在 memmove 中,额外的临时数组用于从源复制 n 个字符,然后将存储的字符复制到目标内存。memcpy 在转发副本时很有用,但 memmove 在重叠场景的情况下很有用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。