#include <stdio.h>
#include <string.h>//使用memcpy函数时记得引用它的头文件
//应用模拟实现的memcpy函数
int main()
{
int arr1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int arr2[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
memcpy(arr1 + 2, arr1, 24);//根据编译器的不同,实现的方式也是不同的;没有具体说明
memmove(arr2 + 2, arr2, 24);//memmove有具体说明实现的方式
int i = 0;
for (i = 0; i < 10; i++)
printf("%d ", arr1[i]);
printf("\n");//实际出现结果
for (i = 0; i < 10; i++)
printf("%d ", arr2[i]);//实际出现结果
return 0;
}
调试的结果为:
虽然结果相同,但是memcpy是没有规定的编译标准的;可能在vs上和memmove一样
但在别的编译器上就会出现别的情况,如下是对memcpy在别的编译器上的模拟实现:
#include<stdio.h>
#include<assert.h>
//模拟实现memcpy
void* my_memcpy(void* dest, const void* scr, size_t count)
{
assert(dest && scr);//断言传进来的地址不是空指针
void* ret = dest;//保存目标起始地址
char*p1=(char*)dest;
char*p2=(char*)scr;
while (count--)//拷贝源地址存储的数据
{
*p1++ = *p2++;
/*(char*)dest = (char*)dest + 1;
(char*)scr = (char*)scr + 1;*/
}
return ret;//返回目标起始地址
}
//应用模拟实现的函数
int main()
{
//int arr1[] = { 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 };
int arr2[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
my_memcpy(arr2+2, arr2, 24);//拷贝6个字节的数据
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
运行结果是:
可以看出memcpy没有固定的标准!
而memmove在所有编译器上都是相同!