站长之家seo工具包,做移动端网站,房屋装修设计师怎么收费,网站遭到攻击 运维怎么做memcpy功能是内存拷贝 从source的位置拷贝前num个字节到destination内存中去#xff0c;类型是void* #xff08;能接受任意类型的指针#xff09;。
注意#xff1a;
1.num的单位是字节#xff0c;函数结束会返回目的地的起始位置。
2.遇到\0不会停止。
3.只能处理不… memcpy功能是内存拷贝 从source的位置拷贝前num个字节到destination内存中去类型是void* 能接受任意类型的指针。
注意
1.num的单位是字节函数结束会返回目的地的起始位置。
2.遇到\0不会停止。
3.只能处理不重叠的内存拷贝。
4.头文件是#includestring.h。
函数实现
#includestdio.h
#includestring.hint main()
{int arr1[20] { 0 };int arr2[10] { 1,2,3,4,5,6,7,8,9,10 };memcpy(arr1, arr2, 20);int i 0;for (i 0; i 20; i){printf(%d , arr1[i]);}return 0;
}
运行结果 我们来模拟实现一下该函数的功能
#includestdio.h
#includeassert.hvoid* my_memcpy(const void* dest, const void* src, size_t num)
{char* ret dest;//要把目的地的起始地址先存起来assert(dest src);//断言需要解引用操作不能是空指针while (num){*(char*)dest *(char*)src;//因为传过来的类型不确定void*需要强制转换成最小的类型char*再解引用dest (char*)dest 1;src (char*)src 1;//强转是临时的所以要再次转换num--;}return ret;//返回目的地的起始地址
}
int main()
{int arr1[] { 1,2,3,4,5,6,7,8,9,10 };int arr2[20] { 0 };my_memcpy(arr2, arr1, 40);int i 0;for (i 0; i 20; i){printf(%d , arr2[i]);}return 0;
}看一下运行结果吧 最后说一下不重叠的内存拷贝 还是那个代码例如我们要从arr1的起始位置拷贝20个字节到arr1的下表为2的目的地去那么我们预期的是什么样呢应该是12123458910。我们运行看结果 我们可以看到结果并不是预期的那样这是因为34的位置还没拷贝就被12覆盖了所以567的拷贝都成了121。
当然这是我们模拟的memcpy函数如果用库函数里的memcpy结果是和我们预期的一样。 为什么会这样呢是我们写的不对并不是memcpy函数只要实现了不重叠拷贝就行只不过在vs上实现了重叠内存的拷贝在其他的编译器上是不确定的。
以后我们需要重叠内存的拷贝最好不要用memcpy函数专业的事还是交给专业的函数来做memmove函数就是拷贝重叠内存的函数memcpy能完成的事它都能做。
下次我们再分享其他内存函数今天就到这里啦。