memcpy() -- 拷贝内存内容
表头文件: #include <string.h>
定义函数: void *memcpy(void *dest, const void *src, size_tn)
函数说明: memcpy()用来拷贝src所指的内存内容前n个字节到dest所指的内存地址上。与strcpy()不同的是,memcpy()会完整的复制n个字节,不会因为遇到字符串结束'\0'而结束
返回值: 返回指向dest的指针
附加说明: 指针src和dest所指的内存区域不可重叠
重叠的例子:
#include <string.h>
#include <stdio.h>
int main()
{
int i = 0;
int a[10];
/*0 1 2 3 4 5 6 7 8 9 */
for(i; i < 10; i++)
{
a[i] = i;
}
/*首先a[0]->a[4],但是a[4]再次操作时出现的重叠*/
memmove(&a[4], a, sizeof(int)*6);
/*0 1 2 3 0 1 2 3 0 1 不可以内存重叠*/
for(i = 0; i < 10; i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
memmove() -- 拷贝内存内容
表头文件: #include <string.h>
定义函数: void *memmove(void *dest, const void *src, size_t n);
函数说明:memmove()与memcpy()一样都是用来拷贝src所指的内存内容前n个字节到dest所指的地址上。
不同的是,当src和dest所指的内存区域重叠时,memmove()仍然可以正确的处理,不过执行效率上会比使用memcpy()略慢些。
返回值: 返回指向dest的指针。附加说明: 指针src和dest所指的内存区域可以重叠。
重叠的例子:
#include <string.h> #include <stdio.h> int main() { int i = 0; int a[10]; /*0 1 2 3 4 5 6 7 8 9 */ for(i; i < 10; i++) { a[i] = i; } /*首先a[0]->a[4],但是a[4]再次操作时出现的重叠*/ memmove(&a[4], a, sizeof(int)*6); /*0 1 2 3 0 1 2 3 4 5 可以内存重叠*/ for(i = 0; i < 10; i++) { printf("%d ",a[i]); } printf("\n"); }
有时VC和GCC结果显示二者一样,这是因为编译器都优化成了可以考虑内存重叠的情况。