C 语⾔⾯试题:内存拷贝函数
最近,准备⼯作,当然是每天刷⼀些笔试题,看看各个知识点,反正也没有固定的复习线路,就根据⾃⼰刷到的题做知识的延申和拓展。今天看到了⼀道这样的题:写⼀个内存拷贝函数 。。。。。。 起先看到这道题的时候感觉⾃⼰是不是没学过这门课,看到这道题的时候是什么也不知道,知识点也学的太薄弱了,然后就是熟悉的搜题环节,⾃⼰不会的就去⽹上呗,反正现在的⽹络上这么多⼤佬,不看⽩不看,看了,理解了,能写出来的,就是⾃⼰的东西了。 那么,什么是内存拷贝函数呢?内存拷贝函数写出来是⽤来做什么的呢? C语⾔中提供了⼀个内存拷贝函数memcpy():
⾸先,先来引⼊另⼀个函数,字符串拷贝函数,strcpy()
strcpy()是⽤来拷贝字符串的(也只能⽤来拷贝字符串),以’\0’结束,⽽内存拷贝函数memcpy()是需要指定拷贝字节数的,各种类型都可以拷贝。
这⾥需要注意,memcpy()在拷贝的时候是⼀个字节⼀个字节的进⾏搬运的,当⽬标内存⾸地址与源内存⾸地址之间的间距不⾜以放下需要拷贝的字节数时,就会发⽣内存重叠的问题,会导致我们拷贝过去的数据把原有的数据覆盖掉了,导致后⾯的数据出错。假设⼀个内存拷贝函数如下:
这就是⼀个简单的内存拷贝函数,在这种情况下是不会出错的:
如何解决这个问题呢,其实已经可以到⽅法了,做条件判断,
当会发⽣内存重叠这个情况时就从⾼地址开始拷贝,也就是从需要拷贝的最后⼀个字节来进⾏拷贝;
所以,⼀个完整的内存拷贝函数应该如下:void  *memcpy (void  *dest ,void  *src ,unsigned  int  size );dest : ⽬标内存⾸地址src : 源内存⾸地址size : 需要拷贝字节数返回值:源内存⾸地址或NULL
1
2
3
4
5void  *mymemcpy (void  *dest ,const  void  *src , int  count ){ assert (dest != NULL  && src != NULL ); void  *ret = dest ; while (count --){  *(char  *)dest = *(char  *)src ;  dest = (char *)dest +1;  src = (char  *)src +1; } return  ret ;}
1
2
3
4
5
6
7
8
9
10mymemcpy (p ,p +1,4);//从⾼地址向低地址拷贝数据的时候就不会出现内存重叠mymemcpy (p2,p1,4);//在两个不同的数组空间也不会发⽣这样的问题mymemcpy (p +5,p ,4);//两个地址相隔的距离⾜够⼤,也不会发⽣问题mymemcpy (p +1,p ,4);//这样就出现问题了,会发现拷贝的全是⼀个字符
1
2
3
4
5if (src >= dest || (char *)dest >= (char *)src +count )
1
好了,这就是⼀个⽐较完整的内存拷贝函数了,解决了在拷贝过程中可能存在的内存拷贝问题,这个在笔试⾯试的过程中考的概率还是很⼤的,还是就是关于字符串的那⼏个函数,在笔试中经常会遇到的,多去看,多去练,还是什么是解决不了的呢。void  *mymemcpy (void  *dest ,const  void  *src , int  count ){ assert (dest != NULL  && src != NULL ); void  *ret = dest ; if (src >= dest || (char  *)dest >= (char  *)src +count ){  while (count --){  *(char *)dest =*(char *)src ;  dest = (char *)dest +1;  src = (char *)src +1;  }else {  dest = (char *)dest +count ;  src = (char *)dest +count ;  while (count --){    dest = (char *)dest -1;    src = (char *src )-1;    *(char *)dest = *(char *)src ;  }  } } return  0;}
1
2
c语言搜题软件推荐3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。