库函数详解(二)—— 内存函数+模拟实现(部分)

代码 代码 1455 人阅读 | 0 人回复

<
文章目次



memcpy——内乱存拷贝1

1.函数功用

145336cc3ife3ebcnwc3br.png

memcpy函数是用于拷贝内乱存块的函数,该函数有三个参数,第一个参数为拷贝的目标所在(void * destination),第两个参数为拷贝源所在(const void * source),由于正在拷贝过程当中源字符串没有会变革,以是参数用 const 润饰,第三个参数为正在内乱存中拷贝的字节数(size_t num),该参数决议了拷贝内乱存的巨细。返回值为拷贝目标的的尾所在,由于没有明晰拷贝数据的范例,以是返回范例为 void* 型。
关于该函数,要留意:
1.函数memcpy从 source 的地位开端背后复造 num 个字节的数据到destination的内乱存地位。
2.那个函数正在碰到 ‘\0’ 的工夫其实不会停下去。
3.假如source战destination有任何的堆叠,复造的成果皆是不决义的(为拷贝的内乱容会被笼盖)。
举个栗子:
145336ik2t5cccmvc5zttk.jpg

2.模仿完成

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<assert.h>
  4. void* my_memcpy(void* dest, const void* src, size_t num)
  5. {
  6.     assert(dest&&src);
  7.         void* ret = dest;
  8.         while (num--)
  9.         {
  10.                 *(char*)dest = *(char*)src;
  11.                 dest = (char*)dest + 1;
  12.                 src = (char*)src + 1;
  13.         }
  14.         return ret;
  15. }
  16. int main()
  17. {
  18.         int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
  19.         int arr2[10] = { 0 };
  20.         my_memcpy(arr2, arr1, 20);
  21.         return 0;
  22. }
复造代码
memmove——内乱存拷贝2(可堆叠)

1.函数功用

145336b0b0z2f2z1gtnb7g.png

该函数的参数的意义取返回范例同memcpy一样,可是该函数的功用取memcpy略有区分,区分正在于:
memmove函数的源内乱存块战目标内乱存块是能够堆叠的,而memcpy函数的源内乱存块战目标内乱存块是不成以堆叠的。
以是正在拷贝中假如源空间战目标空间呈现堆叠,便得利用memmove函数处置。
比方:
145337c1558i8uij8ue5pp.jpg

能够看出,正在上述代码中,第一次利用memmove函数时,arr1 < arr+3 ,且拷贝的内乱存的巨细为20字节(即5个整型),行将arr1中的"4 5 6 7 8"序列拷贝到" 1 2 3 4 5"的地位上,两序列有堆叠的部分,以是为了拷贝胜利,函数是将序列"4 5 6 7 8" 中的内乱存(每一个字节)顺次畴前背后拷贝(若从后背前拷贝,则本来待拷贝的内乱容将会被首先拷贝的内乱容笼盖,从而形成拷贝的序列堕落),以是拷贝的历程以下图所示:
145337bq6k1oidb1qq1llp.png

而正在第两次利用memmove函数时,arr2+2 > arr2,拷贝的内乱存巨细为20字节,为了包管拷贝过程当中的公道,第两次拷贝时内乱存中的序列时从后背前拷贝,以下:
145337ya515upnsbo15b5q.png

以是从以上两次的拷贝成果能够看出memmove的拷贝机造为:
145337dcmhzicaylmhkdhd.jpg

当 dest < src 时,src 指背的内乱容拷贝的方法为畴前背后拷贝
当 dest > src 时,src 指背的内乱容拷贝的方法为从后背前拷贝(如上图)
2.模仿完成

按照拷贝机造我们能够模仿完成该函数:
[code]#include#include#includevoid* my_memmove(void* dest, const void* src, size_t num){        assert(dest && src);//断行        void* ret = dest;//保留待返回的尾所在        if (dest <span class="token operator">
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,按照目前互联网开放的原则,我们将在不通知作者的情况下,转载文章;如果原文明确注明“禁止转载”,我们一定不会转载。如果我们转载的文章不符合作者的版权声明或者作者不想让我们转载您的文章的话,请您发送邮箱:Cdnjson@163.com提供相关证明,我们将积极配合您!
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并自负版权等法律责任。
回复 关闭延时

使用道具 举报

 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则